瀏覽代碼

LibCpp: Parse empty for loops

Itamar 4 年之前
父節點
當前提交
d482b3fd60
共有 2 個文件被更改,包括 15 次插入5 次删除
  1. 5 2
      Userland/Libraries/LibCpp/AST.cpp
  2. 10 3
      Userland/Libraries/LibCpp/Parser.cpp

+ 5 - 2
Userland/Libraries/LibCpp/AST.cpp

@@ -394,8 +394,11 @@ NonnullRefPtrVector<Declaration> Statement::declarations() const
 
 NonnullRefPtrVector<Declaration> ForStatement::declarations() const
 {
-    auto declarations = m_init->declarations();
-    declarations.append(m_body->declarations());
+    NonnullRefPtrVector<Declaration> declarations;
+    if (m_init)
+        declarations.append(m_init->declarations());
+    if (m_body)
+        declarations.append(m_body->declarations());
     return declarations;
 }
 

+ 10 - 3
Userland/Libraries/LibCpp/Parser.cpp

@@ -1204,13 +1204,20 @@ NonnullRefPtr<ForStatement> Parser::parse_for_statement(ASTNode& parent)
     auto for_statement = create_ast_node<ForStatement>(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;
 }