Add parse_initialization_statement

This commit is contained in:
Sofia 2026-04-09 16:24:11 +03:00
parent 9969ad12f6
commit 48feebc714

View File

@ -43,6 +43,28 @@ namespace parsing {
} }
} }
Result<std::unique_ptr<AST::InitializationStatement>, std::string> parse_init_statement(token::TokenStream& stream) {
token::TokenStream inner{ stream };
try {
auto ty = parse_type(inner).unwrap();
auto name = inner.expect(token::Type::Ident);
std::optional<std::unique_ptr<AST::Expression>> expr = {};
if (inner.peek().type == token::Type::Symbol && inner.peek().content == "=") {
inner.expect(token::Type::Symbol, "=");
expr = parse_expression(inner).unwrap();
}
inner.expect(token::Type::Symbol, ";");
stream.m_position = inner.m_position;
return &std::make_unique<AST::InitializationStatement>(std::move(ty), name.content, std::move(expr));
}
catch (std::runtime_error error) {
return new std::string{ error.what() };
}
}
Result<std::unique_ptr<AST::Statement>, std::string> parse_statement(token::TokenStream& stream) { Result<std::unique_ptr<AST::Statement>, std::string> parse_statement(token::TokenStream& stream) {
token::TokenStream inner{ stream }; token::TokenStream inner{ stream };
try { try {
@ -57,20 +79,13 @@ namespace parsing {
return new std::unique_ptr<AST::Statement>{ ret }; return new std::unique_ptr<AST::Statement>{ ret };
} }
else if (inner.peek().type == token::Type::Ident) { else if (inner.peek().type == token::Type::Ident) {
auto ty = parse_type(inner).unwrap(); auto init = parse_init_statement(inner);
auto name = inner.expect(token::Type::Ident); if (init.ok()) {
return new std::unique_ptr<AST::Statement>{ init.unwrap() };
std::optional<std::unique_ptr<AST::Expression>> expr = {}; }
if (inner.peek().type == token::Type::Symbol && inner.peek().content == "=") { else {
inner.expect(token::Type::Symbol, "="); throw std::runtime_error("Expected initialization statement");
expr = parse_expression(inner).unwrap();
} }
inner.expect(token::Type::Symbol, ";");
stream.m_position = inner.m_position;
auto init = new AST::InitializationStatement{ std::move(ty), name.content, std::move(expr) };
return new std::unique_ptr<AST::Statement>{ init };
} }
else { else {
throw std::runtime_error("Expected return-keyword"); throw std::runtime_error("Expected return-keyword");