From 038051d205624b7a91d5154f5cc6db48f9c0c015 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Tue, 21 Apr 2020 19:27:57 +0100 Subject: [PATCH] LibJS: Parse while statements --- Libraries/LibJS/Parser.cpp | 16 ++++++++++++++++ Libraries/LibJS/Parser.h | 1 + Libraries/LibJS/Tests/while-basic.js | 21 +++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 Libraries/LibJS/Tests/while-basic.js diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index 11b5ee984a..d40b2fc1e2 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -249,6 +249,8 @@ NonnullRefPtr Parser::parse_statement() return parse_switch_statement(); case TokenType::Do: return parse_do_while_statement(); + case TokenType::While: + return parse_while_statement(); default: if (match_expression()) { auto expr = parse_expression(0); @@ -847,6 +849,20 @@ NonnullRefPtr Parser::parse_do_while_statement() return create_ast_node(move(test), move(body)); } +NonnullRefPtr 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(move(test), move(body)); +} + NonnullRefPtr Parser::parse_switch_statement() { consume(TokenType::Switch); diff --git a/Libraries/LibJS/Parser.h b/Libraries/LibJS/Parser.h index bceda86121..297c36efe6 100644 --- a/Libraries/LibJS/Parser.h +++ b/Libraries/LibJS/Parser.h @@ -60,6 +60,7 @@ public: NonnullRefPtr parse_break_statement(); NonnullRefPtr parse_continue_statement(); NonnullRefPtr parse_do_while_statement(); + NonnullRefPtr parse_while_statement(); NonnullRefPtr parse_conditional_expression(NonnullRefPtr test); NonnullRefPtr parse_expression(int min_precedence, Associativity associate = Associativity::Right); diff --git a/Libraries/LibJS/Tests/while-basic.js b/Libraries/LibJS/Tests/while-basic.js new file mode 100644 index 0000000000..5868ec7170 --- /dev/null +++ b/Libraries/LibJS/Tests/while-basic.js @@ -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); +}