1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:17:34 +00:00

LibCpp: Parse variable declarations in global scope

This commit is contained in:
Itamar 2021-03-27 18:42:32 +03:00 committed by Andreas Kling
parent 9545c156b5
commit 0babb39cae
2 changed files with 8 additions and 3 deletions

View file

@ -199,7 +199,7 @@ NonnullRefPtr<Statement> Parser::parse_statement(ASTNode& parent)
return parse_comment(parent); return parse_comment(parent);
} }
if (match_variable_declaration()) { if (match_variable_declaration()) {
return parse_variable_declaration(parent); return parse_variable_declaration(parent, false);
} }
if (match_expression()) { if (match_expression()) {
return parse_expression(parent); return parse_expression(parent);
@ -277,7 +277,7 @@ bool Parser::match_variable_declaration()
return match(Token::Type::Semicolon); return match(Token::Type::Semicolon);
} }
NonnullRefPtr<VariableDeclaration> Parser::parse_variable_declaration(ASTNode& parent) NonnullRefPtr<VariableDeclaration> Parser::parse_variable_declaration(ASTNode& parent, bool expect_semicolon)
{ {
SCOPE_LOGGER(); SCOPE_LOGGER();
auto var = create_ast_node<VariableDeclaration>(parent, position(), {}); auto var = create_ast_node<VariableDeclaration>(parent, position(), {});
@ -295,6 +295,9 @@ NonnullRefPtr<VariableDeclaration> Parser::parse_variable_declaration(ASTNode& p
initial_value = parse_expression(var); initial_value = parse_expression(var);
} }
if(expect_semicolon)
consume(Token::Type::Semicolon);
var->set_end(position()); var->set_end(position());
var->m_name = text_of_token(identifier_token); var->m_name = text_of_token(identifier_token);
var->m_initial_value = move(initial_value); var->m_initial_value = move(initial_value);
@ -533,6 +536,8 @@ Optional<Parser::DeclarationType> Parser::match_declaration_in_translation_unit(
return DeclarationType::Struct; return DeclarationType::Struct;
if (match_namespace_declaration()) if (match_namespace_declaration())
return DeclarationType::Namespace; return DeclarationType::Namespace;
if (match_variable_declaration())
return DeclarationType::Variable;
return {}; return {};
} }

View file

@ -97,7 +97,7 @@ private:
NonnullRefPtr<FunctionDeclaration> parse_function_declaration(ASTNode& parent); NonnullRefPtr<FunctionDeclaration> parse_function_declaration(ASTNode& parent);
NonnullRefPtr<FunctionDefinition> parse_function_definition(ASTNode& parent); NonnullRefPtr<FunctionDefinition> parse_function_definition(ASTNode& parent);
NonnullRefPtr<Statement> parse_statement(ASTNode& parent); NonnullRefPtr<Statement> parse_statement(ASTNode& parent);
NonnullRefPtr<VariableDeclaration> parse_variable_declaration(ASTNode& parent); NonnullRefPtr<VariableDeclaration> parse_variable_declaration(ASTNode& parent, bool expect_semicolon=true);
NonnullRefPtr<Expression> parse_expression(ASTNode& parent); NonnullRefPtr<Expression> parse_expression(ASTNode& parent);
NonnullRefPtr<Expression> parse_primary_expression(ASTNode& parent); NonnullRefPtr<Expression> parse_primary_expression(ASTNode& parent);
NonnullRefPtr<Expression> parse_secondary_expression(ASTNode& parent, NonnullRefPtr<Expression> lhs); NonnullRefPtr<Expression> parse_secondary_expression(ASTNode& parent, NonnullRefPtr<Expression> lhs);