Safe refactor
This commit is contained in:
parent
afbfdc7caa
commit
04e390c6f9
1 changed files with 25 additions and 24 deletions
|
@ -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, "(");
|
||||
|
|
Reference in a new issue