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] = [&["+", "-"], &["*", "/"]];
|
const LEFT_ASSOC_BIN_OPS: [&[&str]; 2] = [&["+", "-"], &["*", "/"]];
|
||||||
|
|
||||||
if level == LEFT_ASSOC_BIN_OPS.len() {
|
if level == LEFT_ASSOC_BIN_OPS.len() {
|
||||||
match peek(pos, tokens).text {
|
parse_term(pos, tokens)
|
||||||
"if" => parse_conditional(pos, tokens),
|
|
||||||
"(" => parse_parenthesized(pos, tokens),
|
|
||||||
_ => parse_term(pos, tokens),
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
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 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> {
|
fn parse_conditional<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> {
|
||||||
consume_string(pos, tokens, "if");
|
consume_string(pos, tokens, "if");
|
||||||
let condition = Box::new(parse_expression(0, pos, tokens));
|
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
|
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> {
|
fn parse_function<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> {
|
||||||
let identifier = consume_type(pos, tokens, TokenType::Identifier);
|
let identifier = consume_type(pos, tokens, TokenType::Identifier);
|
||||||
consume_string(pos, tokens, "(");
|
consume_string(pos, tokens, "(");
|
||||||
|
|
Reference in a new issue