From 957463bf2f0ed07ebb8f3a3a1d76770d963a9c3f Mon Sep 17 00:00:00 2001 From: ctsk <9384305+ctsk@users.noreply.github.com> Date: Sun, 8 Oct 2023 12:44:32 +0200 Subject: [PATCH] [rlox] Handle incomplete expression --- rlox/src/lc.rs | 51 ++++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/rlox/src/lc.rs b/rlox/src/lc.rs index 6181a89..df958a9 100644 --- a/rlox/src/lc.rs +++ b/rlox/src/lc.rs @@ -329,31 +329,34 @@ impl<'src> Parser<'src> { } fn _expression(&mut self, chunk: &mut Chunk, min_prec: Precedence) { - match self.scanner.next().unwrap() { - Token { - ttype: TokenType::Minus, - span: _, - } => { - self._expression(chunk, Precedence::Unary); - chunk.add_op(Op::Negate, 0); + match self.scanner.next() { + None => panic!("Expected further tokens"), + Some(token) => match token { + Token { + ttype: TokenType::Minus, + span: _, + } => { + self._expression(chunk, Precedence::Unary); + chunk.add_op(Op::Negate, 0); + } + Token { + ttype: TokenType::Number, + span, + } => { + match span.parse::() { + Ok(c) => chunk.add_constant(c.into(), 0), + _ => panic!("Could not parse number"), + }; + } + Token { + ttype: TokenType::LeftParen, + span: _, + } => { + self._expression(chunk, Precedence::None); + assert_eq!(self.scanner.next().unwrap().ttype, TokenType::RightParen) + } + _ => panic!("Expected '-' or number"), } - Token { - ttype: TokenType::Number, - span, - } => { - match span.parse::() { - Ok(c) => chunk.add_constant(c.into(), 0), - _ => panic!("Could not parse number"), - }; - } - Token { - ttype: TokenType::LeftParen, - span: _, - } => { - self._expression(chunk, Precedence::None); - assert_eq!(self.scanner.next().unwrap().ttype, TokenType::RightParen) - } - _ => panic!("Expected '-' or number"), }; while let Some(op) = self.scanner.next_if(|token| {