diff --git a/src/compiler/parser/mod.rs b/src/compiler/parser/mod.rs index 6c5656e..f272d80 100644 --- a/src/compiler/parser/mod.rs +++ b/src/compiler/parser/mod.rs @@ -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, "(");