From 48feebc714a3cd0d76377fae63d72e468e967f3a Mon Sep 17 00:00:00 2001 From: Sofia Date: Thu, 9 Apr 2026 16:24:11 +0300 Subject: [PATCH] Add parse_initialization_statement --- src/parsing.cpp | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/parsing.cpp b/src/parsing.cpp index d15b2c7..6b19d07 100644 --- a/src/parsing.cpp +++ b/src/parsing.cpp @@ -43,6 +43,28 @@ namespace parsing { } } + Result, 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> 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(std::move(ty), name.content, std::move(expr)); + } + catch (std::runtime_error error) { + return new std::string{ error.what() }; + } + } + Result, std::string> parse_statement(token::TokenStream& stream) { token::TokenStream inner{ stream }; try { @@ -57,20 +79,13 @@ namespace parsing { return new std::unique_ptr{ ret }; } else if (inner.peek().type == token::Type::Ident) { - auto ty = parse_type(inner).unwrap(); - auto name = inner.expect(token::Type::Ident); - - std::optional> expr = {}; - if (inner.peek().type == token::Type::Symbol && inner.peek().content == "=") { - inner.expect(token::Type::Symbol, "="); - expr = parse_expression(inner).unwrap(); + auto init = parse_init_statement(inner); + if (init.ok()) { + return new std::unique_ptr{ init.unwrap() }; + } + else { + throw std::runtime_error("Expected initialization statement"); } - - 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{ init }; } else { throw std::runtime_error("Expected return-keyword");