diff options
author | Vincent Ambo <mail@tazj.in> | 2021-01-14T01·50+0300 |
---|---|---|
committer | tazjin <mail@tazj.in> | 2021-01-14T02·05+0000 |
commit | 8bcbb041606b0fd15459415a3e5531a753c8bfd8 (patch) | |
tree | 7defc4d53cf2fc172ad0d8889cd03d46c73fdd0d | |
parent | fcd9801b017685eb11ef2578fe1b84a0f6a55460 (diff) |
refactor(tazjin/rlox): Add helper method for parsing identifiers r/2102
Change-Id: I9a45f823f16919319d6135225d5bd53ed54c2530 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2388 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
-rw-r--r-- | users/tazjin/rlox/src/errors.rs | 1 | ||||
-rw-r--r-- | users/tazjin/rlox/src/parser.rs | 34 |
2 files changed, 19 insertions, 16 deletions
diff --git a/users/tazjin/rlox/src/errors.rs b/users/tazjin/rlox/src/errors.rs index 484b06bdf6ab..4f173d016039 100644 --- a/users/tazjin/rlox/src/errors.rs +++ b/users/tazjin/rlox/src/errors.rs @@ -6,7 +6,6 @@ pub enum ErrorKind { ExpectedExpression(String), ExpectedSemicolon, ExpectedClosingBrace, - ExpectedVariableName, ExpectedToken(&'static str), TypeError(String), UndefinedVariable(String), diff --git a/users/tazjin/rlox/src/parser.rs b/users/tazjin/rlox/src/parser.rs index ba258a637f8b..74c2f448ede9 100644 --- a/users/tazjin/rlox/src/parser.rs +++ b/users/tazjin/rlox/src/parser.rs @@ -169,24 +169,17 @@ impl<'a> Parser<'a> { fn var_declaration(&mut self) -> StmtResult<'a> { // Since `TokenKind::Identifier` carries data, we can't use // `consume`. - if let TokenKind::Identifier(_) = self.peek().kind { - let mut var = Var { - name: self.advance(), - initialiser: None, - }; - - if self.match_token(&TokenKind::Equal) { - var.initialiser = Some(self.expression()?); - } + let mut var = Var { + name: self.identifier("Expected variable name.")?, + initialiser: None, + }; - self.consume(&TokenKind::Semicolon, ErrorKind::ExpectedSemicolon)?; - return Ok(Statement::Var(var)); + if self.match_token(&TokenKind::Equal) { + var.initialiser = Some(self.expression()?); } - return Err(Error { - line: self.peek().line, - kind: ErrorKind::ExpectedVariableName, - }); + self.consume(&TokenKind::Semicolon, ErrorKind::ExpectedSemicolon)?; + Ok(Statement::Var(var)) } fn statement(&mut self) -> StmtResult<'a> { @@ -492,6 +485,17 @@ impl<'a> Parser<'a> { // internal helpers + fn identifier(&mut self, err: &'static str) -> Result<Token<'a>, Error> { + if let TokenKind::Identifier(_) = self.peek().kind { + Ok(self.advance()) + } else { + Err(Error { + line: self.peek().line, + kind: ErrorKind::ExpectedToken(err), + }) + } + } + /// Check if the next token is in `oneof`, and advance if it is. fn match_token(&mut self, token: &TokenKind) -> bool { if self.check_token(token) { |