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:
parent
7e01e38cf4
commit
038051d205
3 changed files with 38 additions and 0 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
21
Libraries/LibJS/Tests/while-basic.js
Normal file
21
Libraries/LibJS/Tests/while-basic.js
Normal 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);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue