[fine] Tests for conditional, semicolon optional at end of block

Just like rust, ';' means "discard this value".
This commit is contained in:
John Doty 2024-01-04 19:47:44 -08:00
parent ec5e59aed3
commit f203da328b
2 changed files with 38 additions and 6 deletions

View file

@ -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);
}