diff --git a/fine/src/parser.rs b/fine/src/parser.rs index 8a7ca568..fd0619b0 100644 --- a/fine/src/parser.rs +++ b/fine/src/parser.rs @@ -343,9 +343,17 @@ impl<'a> CParser<'a> { events: Vec::new(), panic: false, }; - parser.current = parser.tokens.next(); - parser.next = parser.tokens.next(); - parser.skip_ephemera(); + + // Getting started: put the first token into `next` and then fast + // forward past ephemera to the first "real" token. + parser.next_real_token(); + + // Put `next` into `current`. + std::mem::swap(&mut parser.current, &mut parser.next); + + // Now set `next` to the *next* real token. + parser.next_real_token(); + parser } @@ -385,15 +393,12 @@ impl<'a> CParser<'a> { }); // Move next into current (and current into next but who cares, thanks rust.) std::mem::swap(&mut self.current, &mut self.next); - self.next = self.tokens.next(); - self.skip_ephemera(); + self.next_real_token(); } - fn skip_ephemera(&mut self) { - while self.current.kind == TokenKind::Whitespace || self.current.kind == TokenKind::Comment - { - // Move next into current (and current into next but who cares, thanks rust.) - std::mem::swap(&mut self.current, &mut self.next); + fn next_real_token(&mut self) { + self.next = self.tokens.next(); + while self.next.kind == TokenKind::Whitespace || self.next.kind == TokenKind::Comment { self.next = self.tokens.next(); } } @@ -991,6 +996,8 @@ fn is_expression(p: &mut CParser, left: MarkClosed, right_power: u8) -> MarkClos p.end(m, TreeKind::IsExpression) } +const PATTERN_START: &[TokenKind] = &[TokenKind::Identifier, TokenKind::Underscore]; + fn pattern(p: &mut CParser, right_power: u8) { let m = p.start(); @@ -1260,7 +1267,7 @@ fn match_body(p: &mut CParser) { p.expect_start(TokenKind::LeftBrace); while !p.at(TokenKind::RightBrace) && !p.eof() { - if p.at(TokenKind::Identifier) { + if p.at_any(PATTERN_START) { // TODO: type_expr_first ? match_arm(p); } else {