From 8ceb48a4e60b8ff89f28372da4f66cd152e2e0fe Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Mon, 13 Jul 2026 23:59:36 +0200 Subject: Change record constructor syntax --- include/elna/boot/ast.h | 25 +++++++++++++++++++++++++ include/elna/boot/semantic.h | 6 ++---- include/elna/gcc/elna-generic.h | 1 + 3 files changed, 28 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/elna/boot/ast.h b/include/elna/boot/ast.h index ab79c30..67e9fbe 100644 --- a/include/elna/boot/ast.h +++ b/include/elna/boot/ast.h @@ -60,6 +60,8 @@ namespace elna::boot class type_declaration; class procedure_call; class cast_expression; + class record_constructor_expression; + struct field_initializer; class assign_statement; class if_statement; class import_declaration; @@ -97,6 +99,7 @@ namespace elna::boot virtual void visit(type_declaration *) = 0; virtual void visit(procedure_call *) = 0; virtual void visit(cast_expression *) = 0; + virtual void visit(record_constructor_expression *) = 0; virtual void visit(traits_expression *) = 0; virtual void visit(assign_statement *) = 0; virtual void visit(if_statement *) = 0; @@ -152,6 +155,7 @@ namespace elna::boot [[noreturn]] virtual void visit(procedure_call *) override; [[noreturn]] virtual void visit(unit *) override; [[noreturn]] virtual void visit(cast_expression *) override; + [[noreturn]] virtual void visit(record_constructor_expression *) override; [[noreturn]] virtual void visit(traits_expression *) override; [[noreturn]] virtual void visit(binary_expression *) override; [[noreturn]] virtual void visit(unary_expression *) override; @@ -194,6 +198,7 @@ namespace elna::boot virtual void visit(procedure_call *call) override; virtual void visit(unit *unit) override; virtual void visit(cast_expression *expression) override; + virtual void visit(record_constructor_expression *expression) override; virtual void visit(traits_expression *trait) override; virtual void visit(binary_expression *expression) override; virtual void visit(unary_expression *expression) override; @@ -325,6 +330,26 @@ namespace elna::boot record_type_expression *is_record() override; }; + struct field_initializer + { + std::string name; + expression *value; + }; + + class record_constructor_expression : public expression + { + public: + const std::string type_name; + const std::vector field_initializers; + + record_constructor_expression(const struct position position, + std::string&& type_name, + std::vector&& field_initializers); + void accept(parser_visitor *visitor) override; + + virtual ~record_constructor_expression() override; + }; + /** * Enumeration type. */ diff --git a/include/elna/boot/semantic.h b/include/elna/boot/semantic.h index 1e81ebb..5ef4bc8 100644 --- a/include/elna/boot/semantic.h +++ b/include/elna/boot/semantic.h @@ -150,10 +150,6 @@ namespace elna::boot bool check_unresolved_symbol(std::shared_ptr alias, std::vector& path); - std::size_t match_record_fields(const std::shared_ptr& record, - std::vector::const_iterator& argument_it, - const std::vector::const_iterator& argument_end); - public: explicit type_analysis_visitor(symbol_bag bag); @@ -165,6 +161,7 @@ namespace elna::boot void visit(record_type_expression *expression) override; void visit(procedure_call *call) override; void visit(case_statement *statement) override; + void visit(record_constructor_expression *expression) override; }; /** @@ -195,6 +192,7 @@ namespace elna::boot void visit(pointer_type_expression *expression) override; void visit(type_declaration *declaration) override; void visit(record_type_expression *expression) override; + void visit(record_constructor_expression *expression) override; void visit(procedure_type_expression *expression) override; void visit(enumeration_type_expression *expression) override; diff --git a/include/elna/gcc/elna-generic.h b/include/elna/gcc/elna-generic.h index 2fe4d48..f30f9d6 100644 --- a/include/elna/gcc/elna-generic.h +++ b/include/elna/gcc/elna-generic.h @@ -83,6 +83,7 @@ namespace elna::gcc void visit(boot::field_access_expression *expression) override; void visit(boot::dereference_expression *expression) override; void visit(boot::unit *unit) override; + void visit(boot::record_constructor_expression *expression) override; void visit(boot::assign_statement *statement) override; void visit(boot::if_statement *statement) override; void visit(boot::import_declaration *) override; -- cgit v1.2.3