From 55388bc6e341d195a6bf59003ebd037d9d931b5d Mon Sep 17 00:00:00 2001 From: Sofia Date: Wed, 15 Apr 2026 16:06:58 +0300 Subject: [PATCH] Parse listinitializer --- src/parsing.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ test.c | 3 +-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/parsing.cpp b/src/parsing.cpp index bcc68cd..8e39dd1 100644 --- a/src/parsing.cpp +++ b/src/parsing.cpp @@ -71,9 +71,49 @@ namespace parsing { } } + Result, std::string> parse_list_initializer(token::TokenStream& stream) { + token::TokenStream inner{ stream }; + try { + auto before_meta = inner.metadata(); + + inner.expect(token::Type::Symbol, "{"); + + std::vector> expressions{}; + + int counter = 0; + while (inner.peek().content != "}") { + if (counter++ > 0) { + inner.expect(token::Type::Symbol, ","); + } + expressions.push_back(parse_expression(inner).unwrap()); + } + + inner.expect(token::Type::Symbol, "}"); + + stream.m_position = inner.m_position; + return std::unique_ptr { + new AST::ListInitializerExpression( + before_meta + inner.metadata(), + std::move(expressions), + std::shared_ptr { + new types::FundamentalType{ types::FundamentalTypeKind::Any } + }) + }; + } + catch (std::runtime_error& error) { + return std::string{ error.what() }; + } + } + Result, std::string> parse_plain_expression(token::TokenStream& stream) { token::TokenStream inner{ stream }; try { + if (auto list_init = parse_list_initializer(inner); list_init.ok()) { + stream.m_position = inner.m_position; + + return std::unique_ptr { list_init.unwrap() }; + } + auto token = inner.next(); if (token.type == token::Type::LiteralInt) { stream.m_position = inner.m_position; diff --git a/test.c b/test.c index 96b9cf3..d9145fb 100644 --- a/test.c +++ b/test.c @@ -14,9 +14,8 @@ int main() { char text[29] = "10th fibonacci number is %d!"; printf(text, fibonacci(10)); - char somelist[5]; + char somelist[5] = { 1, 2, 3, 4, 5 }; - somelist[0] = 15; change_first(somelist); return somelist[0];