From 4812fc2ee64536502093da04ea8a0efe616ffb26 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 6 Dec 2020 15:28:16 +0100 Subject: feat(tazjin/rlox): Implement parsing of parenthesised expressions Change-Id: I0e6bd71fd787b719104ef93fc52df4090dc415b9 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2234 Reviewed-by: tazjin Tested-by: BuildkiteCI --- users/tazjin/rlox/src/errors.rs | 1 + users/tazjin/rlox/src/parser.rs | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/users/tazjin/rlox/src/errors.rs b/users/tazjin/rlox/src/errors.rs index bab3f4667a..6bd922bc6c 100644 --- a/users/tazjin/rlox/src/errors.rs +++ b/users/tazjin/rlox/src/errors.rs @@ -2,6 +2,7 @@ pub enum ErrorKind { UnexpectedChar(char), UnterminatedString, + UnmatchedParens, } #[derive(Debug)] diff --git a/users/tazjin/rlox/src/parser.rs b/users/tazjin/rlox/src/parser.rs index 62a8b5fe4d..e7266c2352 100644 --- a/users/tazjin/rlox/src/parser.rs +++ b/users/tazjin/rlox/src/parser.rs @@ -118,7 +118,9 @@ impl<'a> Parser<'a> { TokenKind::String(string) => Literal::String(string), TokenKind::LeftParen => { - unimplemented!("need error handling to deal with unbalanced parens"); + let expr = self.expression()?; + self.consume(&TokenKind::RightParen, ErrorKind::UnmatchedParens)?; + return Ok(Expr::Grouping(Grouping(Box::new(expr)))); } // This branch indicates a parser bug, not invalid input. @@ -168,6 +170,18 @@ impl<'a> Parser<'a> { self.tokens[self.current - 1].clone() } + fn consume(&mut self, kind: &TokenKind, err: ErrorKind) -> Result<(), Error> { + if self.check_token(kind) { + self.advance(); + return Ok(()); + } + + Err(Error { + line: self.peek().line, + kind: err, + }) + } + fn binary_operator( &mut self, oneof: &[TokenKind], -- cgit 1.4.1