From 3c45dcbb4c255e25f9d5223a53bb6abcad81bfe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vili=20Sinerv=C3=A4?= Date: Tue, 28 Jan 2025 17:04:19 +0200 Subject: [PATCH] Parse multiple BinaryOps and fix associated tests --- src/compiler/parser.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/compiler/parser.rs b/src/compiler/parser.rs index 5804ecd..b3147ae 100644 --- a/src/compiler/parser.rs +++ b/src/compiler/parser.rs @@ -92,10 +92,16 @@ fn parse_term<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression } fn parse_expression<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> { - let left = parse_term(pos, tokens); - let operator_token = next_expect_strings(pos, tokens, &vec!["+", "-"]); - let right = parse_term(pos, tokens); - Expression::BinaryOp(Box::new(left), operator_token.text, Box::new(right)) + let mut left = parse_term(pos, tokens); + + while vec!["+", "-"].contains(&peek(pos, tokens).text) { + let operator_token = next_expect_strings(pos, tokens, &vec!["+", "-"]); + let right = parse_term(pos, tokens); + + left = BinaryOp(Box::new(left), operator_token.text, Box::new(right)); + } + + left } #[cfg(test)] @@ -161,13 +167,13 @@ mod tests { assert_eq!( result, BinaryOp( - Box::new(IntLiteral(1)), - "+", Box::new(BinaryOp( - Box::new(IntLiteral(2)), - "-", - Box::new(IntLiteral(3)) - )) + Box::new(IntLiteral(1)), + "+", + Box::new(IntLiteral(2)) + )), + "-", + Box::new(IntLiteral(3)) ) ); }