1
0
Fork 0

Safe refactor

This commit is contained in:
Vili Sinervä 2025-01-31 13:05:47 +02:00
parent afbfdc7caa
commit 04e390c6f9
No known key found for this signature in database
GPG key ID: DF8FEAF54EFAC996

View file

@ -30,11 +30,7 @@ fn parse_expression<'source>(
const LEFT_ASSOC_BIN_OPS: [&[&str]; 2] = [&["+", "-"], &["*", "/"]];
if level == LEFT_ASSOC_BIN_OPS.len() {
match peek(pos, tokens).text {
"if" => parse_conditional(pos, tokens),
"(" => parse_parenthesized(pos, tokens),
_ => parse_term(pos, tokens),
}
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) {
@ -47,6 +43,30 @@ fn parse_expression<'source>(
}
}
fn parse_term<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> {
let token = peek(pos, tokens);
match token.token_type {
TokenType::Integer => parse_int_literal(pos, tokens),
TokenType::Identifier => match token.text {
"if" => parse_conditional(pos, tokens),
"true" | "false" => parse_bool_literal(pos, tokens),
_ => {
if peek(&mut (*pos + 1), tokens).text == "(" {
parse_function(pos, tokens)
} else {
parse_identifier(pos, tokens)
}
}
},
TokenType::Punctuation => match token.text {
"(" => parse_parenthesized(pos, tokens),
_ => todo!(),
},
_ => panic!("Unexpected {}", token),
}
}
fn parse_conditional<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> {
consume_string(pos, tokens, "if");
let condition = Box::new(parse_expression(0, pos, tokens));
@ -71,25 +91,6 @@ fn parse_parenthesized<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> E
expression
}
fn parse_term<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> {
let token = peek(pos, tokens);
match token.token_type {
TokenType::Integer => parse_int_literal(pos, tokens),
TokenType::Identifier => match token.text {
"true" | "false" => parse_bool_literal(pos, tokens),
_ => {
if peek(&mut (*pos + 1), tokens).text == "(" {
parse_function(pos, tokens)
} else {
parse_identifier(pos, tokens)
}
}
},
_ => panic!("Unexpected {}", token),
}
}
fn parse_function<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> {
let identifier = consume_type(pos, tokens, TokenType::Identifier);
consume_string(pos, tokens, "(");