1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 23:17:44 +00:00

LibJS: Parse while statements

This commit is contained in:
Linus Groh 2020-04-21 19:27:57 +01:00 committed by Andreas Kling
parent 7e01e38cf4
commit 038051d205
3 changed files with 38 additions and 0 deletions

View file

@ -249,6 +249,8 @@ NonnullRefPtr<Statement> Parser::parse_statement()
return parse_switch_statement(); return parse_switch_statement();
case TokenType::Do: case TokenType::Do:
return parse_do_while_statement(); return parse_do_while_statement();
case TokenType::While:
return parse_while_statement();
default: default:
if (match_expression()) { if (match_expression()) {
auto expr = parse_expression(0); auto expr = parse_expression(0);
@ -847,6 +849,20 @@ NonnullRefPtr<DoWhileStatement> Parser::parse_do_while_statement()
return create_ast_node<DoWhileStatement>(move(test), move(body)); return create_ast_node<DoWhileStatement>(move(test), move(body));
} }
NonnullRefPtr<WhileStatement> Parser::parse_while_statement()
{
consume(TokenType::While);
consume(TokenType::ParenOpen);
auto test = parse_expression(0);
consume(TokenType::ParenClose);
auto body = parse_statement();
return create_ast_node<WhileStatement>(move(test), move(body));
}
NonnullRefPtr<SwitchStatement> Parser::parse_switch_statement() NonnullRefPtr<SwitchStatement> Parser::parse_switch_statement()
{ {
consume(TokenType::Switch); consume(TokenType::Switch);

View file

@ -60,6 +60,7 @@ public:
NonnullRefPtr<BreakStatement> parse_break_statement(); NonnullRefPtr<BreakStatement> parse_break_statement();
NonnullRefPtr<ContinueStatement> parse_continue_statement(); NonnullRefPtr<ContinueStatement> parse_continue_statement();
NonnullRefPtr<DoWhileStatement> parse_do_while_statement(); NonnullRefPtr<DoWhileStatement> parse_do_while_statement();
NonnullRefPtr<WhileStatement> parse_while_statement();
NonnullRefPtr<ConditionalExpression> parse_conditional_expression(NonnullRefPtr<Expression> test); NonnullRefPtr<ConditionalExpression> parse_conditional_expression(NonnullRefPtr<Expression> test);
NonnullRefPtr<Expression> parse_expression(int min_precedence, Associativity associate = Associativity::Right); NonnullRefPtr<Expression> parse_expression(int min_precedence, Associativity associate = Associativity::Right);

View file

@ -0,0 +1,21 @@
load("test-common.js");
try {
var number = 0;
while (number < 9) {
number++;
}
assert(number === 9);
number = 0;
while(number < 3) number++;
assert(number === 3);
while (false) {
assertNotReached();
}
console.log("PASS");
} catch (e) {
console.log("FAIL: " + e);
}