Add assignment parsing
This commit is contained in:
parent
3080313e8c
commit
22083ae1f2
2 changed files with 17 additions and 2 deletions
|
@ -39,8 +39,17 @@ fn parse_expression<'source>(
|
||||||
];
|
];
|
||||||
|
|
||||||
match level {
|
match level {
|
||||||
// 0 => todo!(),
|
0 => {
|
||||||
0..=6 => {
|
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);
|
let mut left = parse_expression(level + 1, pos, tokens);
|
||||||
while OPS[level].contains(&peek(pos, tokens).text) {
|
while OPS[level].contains(&peek(pos, tokens).text) {
|
||||||
let operator_token = consume_strings(pos, tokens, OPS[level]);
|
let operator_token = consume_strings(pos, tokens, OPS[level]);
|
||||||
|
|
|
@ -150,6 +150,12 @@ fn test_assignment_chain() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_assignment_invalid() {
|
||||||
|
parse(&tokenize("a ="));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_unary_basic() {
|
fn test_unary_basic() {
|
||||||
let result = parse(&tokenize("not x"));
|
let result = parse(&tokenize("not x"));
|
||||||
|
|
Reference in a new issue