diff --git a/fine/src/parser/concrete.rs b/fine/src/parser/concrete.rs index 7e857af1..4af5069b 100644 --- a/fine/src/parser/concrete.rs +++ b/fine/src/parser/concrete.rs @@ -422,7 +422,9 @@ fn statement_let(p: &mut CParser) { p.expect(TokenKind::Identifier, "expected a name for the variable"); p.expect(TokenKind::Equal, "expected a '=' after the variable name"); expression(p); - p.expect(TokenKind::Semicolon, "expect ';' to end a let statement"); + if !p.at(TokenKind::RightBrace) { + p.expect(TokenKind::Semicolon, "expect ';' to end a let statement"); + } p.end(m, TreeKind::LetStatement); } @@ -436,7 +438,9 @@ fn statement_return(p: &mut CParser) { "expect 'return' to start a return statement", ); expression(p); - p.expect(TokenKind::Semicolon, "expect ';' to end a return statement"); + if !p.at(TokenKind::RightBrace) { + p.expect(TokenKind::Semicolon, "expect ';' to end a return statement"); + } p.end(m, TreeKind::ReturnStatement); } @@ -445,10 +449,12 @@ fn statement_expression(p: &mut CParser) { let m = p.start(); expression(p); - p.expect( - TokenKind::Semicolon, - "expect ';' to end an expression statement", - ); + if !p.at(TokenKind::RightBrace) { + p.expect( + TokenKind::Semicolon, + "expect ';' to end an expression statement", + ); + } p.end(m, TreeKind::ExpressionStatement); } diff --git a/fine/tests/expression/conditional.fine b/fine/tests/expression/conditional.fine new file mode 100644 index 00000000..a3224eb1 --- /dev/null +++ b/fine/tests/expression/conditional.fine @@ -0,0 +1,26 @@ +// concrete: +// | File +// | IfStatement +// | ConditionalExpression +// | If:'"if"' +// | LiteralExpression +// | True:'"true"' +// | Block +// | LeftBrace:'"{"' +// | ExpressionStatement +// | LiteralExpression +// | String:'"\"discarded\""' +// | Semicolon:'";"' +// | ExpressionStatement +// | LiteralExpression +// | Number:'"23"' +// | RightBrace:'"}"' +// | Else:'"else"' +// | Block +// | LeftBrace:'"{"' +// | ExpressionStatement +// | LiteralExpression +// | Number:'"45"' +// | RightBrace:'"}"' +// +if true { "discarded"; 23 } else { 45 }