Support else-if expressions (but not statements yet)

This commit is contained in:
mars 2022-03-02 14:05:12 -07:00
parent 2beb493aad
commit 8c2af9ab61
1 changed files with 15 additions and 2 deletions

View File

@ -524,9 +524,17 @@ impl<'a> IfExpr<'a> {
pub fn build(lexer: &mut Lexer<'a>) -> Self {
let test_expr = Box::new(Self::eat_test_expr(lexer));
let then_body = BranchBody::build(lexer);
lexer.eat_expect(Token::Else);
lexer.eat_expect(Token::BraceOpen);
let else_body = BranchBody::build(lexer);
let else_body = match lexer.next().unwrap() {
Token::BraceOpen => BranchBody::build(lexer),
Token::If => BranchBody {
statements: Vec::new(),
tail_expr: Some(Box::new(Expr::If(IfExpr::build(lexer)))),
},
_ => lexer.panic_message("Expected if or opening brace"),
};
Self {
test_expr,
then_body,
@ -674,6 +682,11 @@ mod tests {
parse_expr("if true { 1 } else { 0 };");
}
#[test]
fn else_if_expr() {
parse_expr("if a { 1 } else if b { 2 } else { c };");
}
#[test]
fn func_call() {
parse_expr("func_call(1 + 2, 3, 4 * 5);");