From 22083ae1f209ba51a0eb91fb5f184d71580741f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vili=20Sinerv=C3=A4?= Date: Fri, 31 Jan 2025 14:19:01 +0200 Subject: [PATCH] Add assignment parsing --- src/compiler/parser/mod.rs | 13 +++++++++++-- src/compiler/parser/tests.rs | 6 ++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/compiler/parser/mod.rs b/src/compiler/parser/mod.rs index 966d2c3..ef286ae 100644 --- a/src/compiler/parser/mod.rs +++ b/src/compiler/parser/mod.rs @@ -39,8 +39,17 @@ fn parse_expression<'source>( ]; match level { - // 0 => todo!(), - 0..=6 => { + 0 => { + let left = parse_expression(level + 1, pos, tokens); + if OPS[level].contains(&peek(pos, tokens).text) { + let operator_token = consume_strings(pos, tokens, OPS[level]); + let right = parse_expression(level, pos, tokens); + BinaryOp(Box::new(left), operator_token.text, Box::new(right)) + } else { + left + } + } + 1..=6 => { let mut left = parse_expression(level + 1, pos, tokens); while OPS[level].contains(&peek(pos, tokens).text) { let operator_token = consume_strings(pos, tokens, OPS[level]); diff --git a/src/compiler/parser/tests.rs b/src/compiler/parser/tests.rs index 98df521..a363a42 100644 --- a/src/compiler/parser/tests.rs +++ b/src/compiler/parser/tests.rs @@ -150,6 +150,12 @@ fn test_assignment_chain() { ); } +#[test] +#[should_panic] +fn test_assignment_invalid() { + parse(&tokenize("a =")); +} + #[test] fn test_unary_basic() { let result = parse(&tokenize("not x"));