From d482b3fd60af5bc3bd1a2da5fb72d6f3dcfdb47d Mon Sep 17 00:00:00 2001 From: Itamar Date: Fri, 2 Apr 2021 11:02:14 +0300 Subject: [PATCH] LibCpp: Parse empty for loops --- Userland/Libraries/LibCpp/AST.cpp | 7 +++++-- Userland/Libraries/LibCpp/Parser.cpp | 13 ++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibCpp/AST.cpp b/Userland/Libraries/LibCpp/AST.cpp index 5ae64b30a4..f81e65ef88 100644 --- a/Userland/Libraries/LibCpp/AST.cpp +++ b/Userland/Libraries/LibCpp/AST.cpp @@ -394,8 +394,11 @@ NonnullRefPtrVector Statement::declarations() const NonnullRefPtrVector ForStatement::declarations() const { - auto declarations = m_init->declarations(); - declarations.append(m_body->declarations()); + NonnullRefPtrVector declarations; + if (m_init) + declarations.append(m_init->declarations()); + if (m_body) + declarations.append(m_body->declarations()); return declarations; } diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index 6c77bcf956..c4afb9ccf0 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -1204,13 +1204,20 @@ NonnullRefPtr Parser::parse_for_statement(ASTNode& parent) auto for_statement = create_ast_node(parent, position(), {}); consume(Token::Type::Keyword); consume(Token::Type::LeftParen); - for_statement->m_init = parse_variable_declaration(*for_statement); + if (peek().type() != Token::Type::Semicolon) + for_statement->m_init = parse_variable_declaration(*for_statement, false); consume(Token::Type::Semicolon); - for_statement->m_test = parse_expression(*for_statement); + + if (peek().type() != Token::Type::Semicolon) + for_statement->m_test = parse_expression(*for_statement); consume(Token::Type::Semicolon); - for_statement->m_update = parse_expression(*for_statement); + + if (peek().type() != Token::Type::RightParen) + for_statement->m_update = parse_expression(*for_statement); consume(Token::Type::RightParen); + for_statement->m_body = parse_statement(*for_statement); + for_statement->set_end(for_statement->m_body->end()); return for_statement; }