Introduce pattern_list to parse pipe separated patterns

pattern_list comes in two variants, one uses the default PAT_RECOVERY_SET as the
recovery set, while other allows the user to provide a recovery set.
This commit is contained in:
Ville Penttinen 2019-03-05 11:28:53 +02:00
parent 1f4468a8da
commit eb1ac43867
2 changed files with 18 additions and 10 deletions

View file

@ -290,11 +290,7 @@ fn for_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
fn cond(p: &mut Parser) {
let m = p.start();
if p.eat(LET_KW) {
p.eat(PIPE);
patterns::pattern(p);
while p.eat(PIPE) {
patterns::pattern(p);
}
patterns::pattern_list(p);
p.expect(EQ);
}
expr_no_struct(p);
@ -386,11 +382,7 @@ pub(crate) fn match_arm_list(p: &mut Parser) {
// }
fn match_arm(p: &mut Parser) -> BlockLike {
let m = p.start();
p.eat(PIPE);
patterns::pattern_r(p, TokenSet::empty());
while p.eat(PIPE) {
patterns::pattern(p);
}
patterns::pattern_list_r(p, TokenSet::empty());
if p.at(IF_KW) {
match_guard(p);
}

View file

@ -8,6 +8,22 @@ pub(super) fn pattern(p: &mut Parser) {
pattern_r(p, PAT_RECOVERY_SET)
}
/// Parses a pattern list separated by pipes `|`
pub(super) fn pattern_list(p: &mut Parser) {
pattern_list_r(p, PAT_RECOVERY_SET)
}
/// Parses a pattern list separated by pipes `|`
/// using the given `recovery_set`
pub(super) fn pattern_list_r(p: &mut Parser, recovery_set: TokenSet) {
p.eat(PIPE);
pattern_r(p, recovery_set);
while p.eat(PIPE) {
pattern_r(p, recovery_set);
}
}
pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
if let Some(lhs) = atom_pat(p, recovery_set) {
// test range_pat