Add unary op parsing
This commit is contained in:
parent
ca254a34c6
commit
3080313e8c
1 changed files with 24 additions and 10 deletions
|
@ -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!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue