1
0
Fork 0

Add unary op parsing

This commit is contained in:
Vili Sinervä 2025-01-31 14:04:17 +02:00
parent ca254a34c6
commit 3080313e8c
No known key found for this signature in database
GPG key ID: DF8FEAF54EFAC996

View file

@ -27,26 +27,40 @@ fn parse_expression<'source>(
pos: &mut usize, pos: &mut usize,
tokens: &[Token<'source>], tokens: &[Token<'source>],
) -> Expression<'source> { ) -> Expression<'source> {
const LEFT_ASSOC_BIN_OPS: [&[&str]; 6] = [ const OPS: [&[&str]; 8] = [
&["="],
&["or"], &["or"],
&["and"], &["and"],
&["==", "!="], &["==", "!="],
&["<", "<=", "=>", ">"], &["<", "<=", "=>", ">"],
&["+", "-"], &["+", "-"],
&["*", "/", "%"], &["*", "/", "%"],
&["not", "-"],
]; ];
if level == LEFT_ASSOC_BIN_OPS.len() { match level {
parse_term(pos, tokens) // 0 => todo!(),
} else { 0..=6 => {
let mut left = parse_expression(level + 1, pos, tokens); let mut left = parse_expression(level + 1, pos, tokens);
while LEFT_ASSOC_BIN_OPS[level].contains(&peek(pos, tokens).text) { while OPS[level].contains(&peek(pos, tokens).text) {
let operator_token = consume_strings(pos, tokens, LEFT_ASSOC_BIN_OPS[level]); let operator_token = consume_strings(pos, tokens, OPS[level]);
let right = parse_expression(level + 1, pos, tokens); 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!(),
} }
} }