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

View file

@ -8,6 +8,22 @@ pub(super) fn pattern(p: &mut Parser) {
pattern_r(p, PAT_RECOVERY_SET) 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) { pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
if let Some(lhs) = atom_pat(p, recovery_set) { if let Some(lhs) = atom_pat(p, recovery_set) {
// test range_pat // test range_pat