diff --git a/src/parse.rs b/src/parse.rs index 19d92f2..6e7658c 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -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);");