From 3080313e8c369019ed59c27abbf60ccafe3b494c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vili=20Sinerv=C3=A4?= Date: Fri, 31 Jan 2025 14:04:17 +0200 Subject: [PATCH] Add unary op parsing --- src/compiler/parser/mod.rs | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/compiler/parser/mod.rs b/src/compiler/parser/mod.rs index 9b41ef7..966d2c3 100644 --- a/src/compiler/parser/mod.rs +++ b/src/compiler/parser/mod.rs @@ -27,26 +27,40 @@ fn parse_expression<'source>( pos: &mut usize, tokens: &[Token<'source>], ) -> Expression<'source> { - const LEFT_ASSOC_BIN_OPS: [&[&str]; 6] = [ + const OPS: [&[&str]; 8] = [ + &["="], &["or"], &["and"], &["==", "!="], &["<", "<=", "=>", ">"], &["+", "-"], &["*", "/", "%"], + &["not", "-"], ]; - if level == LEFT_ASSOC_BIN_OPS.len() { - parse_term(pos, tokens) - } else { - let mut left = parse_expression(level + 1, pos, tokens); - while LEFT_ASSOC_BIN_OPS[level].contains(&peek(pos, tokens).text) { - let operator_token = consume_strings(pos, tokens, LEFT_ASSOC_BIN_OPS[level]); - let right = parse_expression(level + 1, pos, tokens); + match level { + // 0 => todo!(), + 0..=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]); + let right = parse_expression(level + 1, pos, tokens); - left = BinaryOp(Box::new(left), operator_token.text, Box::new(right)); + left = BinaryOp(Box::new(left), operator_token.text, Box::new(right)); + } + left } - left + 7 => { + if OPS[level].contains(&peek(pos, tokens).text) { + let operator_token = consume_strings(pos, tokens, OPS[level]); + let right = parse_expression(level, pos, tokens); + UnaryOp(operator_token.text, Box::new(right)) + } else { + parse_expression(level + 1, pos, tokens) + } + } + 8 => parse_term(pos, tokens), + _ => unreachable!(), } }