diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-07-13 23:59:36 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-07-13 23:59:36 +0200 |
| commit | 8ceb48a4e60b8ff89f28372da4f66cd152e2e0fe (patch) | |
| tree | b5e5522c47de3a7f62cd51a3258bfec7e99c062e /include | |
| parent | 500c0676b3f6cd5a2297987d5b0dc7ccf34a28d9 (diff) | |
| download | elna-8ceb48a4e60b8ff89f28372da4f66cd152e2e0fe.tar.gz | |
Change record constructor syntax
Diffstat (limited to 'include')
| -rw-r--r-- | include/elna/boot/ast.h | 25 | ||||
| -rw-r--r-- | include/elna/boot/semantic.h | 6 | ||||
| -rw-r--r-- | include/elna/gcc/elna-generic.h | 1 |
3 files changed, 28 insertions, 4 deletions
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_initializer> field_initializers; + + record_constructor_expression(const struct position position, + std::string&& type_name, + std::vector<field_initializer>&& 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_type> alias, std::vector<std::string>& path); - std::size_t match_record_fields(const std::shared_ptr<record_type>& record, - std::vector<expression *>::const_iterator& argument_it, - const std::vector<expression *>::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; |
