From da1e84e33de1a9c2cc1745b8f42bc7f0cee8fc5c Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 9 Oct 2026 23:35:03 +0200 Subject: Add const sections --- include/elna/boot/ast.h | 24 ++++++++++++++++++++++++ include/elna/boot/materialization.h | 4 +++- include/elna/boot/name_analysis.h | 5 +++++ include/elna/boot/symbol.h | 25 +++++++++++++++++++++++++ include/elna/boot/validation.h | 1 + include/elna/gcc/elna-generic.h | 1 + 6 files changed, 59 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/elna/boot/ast.h b/include/elna/boot/ast.h index 8f8da13..c12d8e8 100644 --- a/include/elna/boot/ast.h +++ b/include/elna/boot/ast.h @@ -111,6 +111,7 @@ namespace elna::boot class variable_declaration; class procedure_declaration; class type_declaration; + class constant_declaration; class procedure_call; class cast_expression; class record_constructor_expression; @@ -154,11 +155,15 @@ namespace elna::boot */ struct block { + std::vector constants; std::vector variables; std::vector statements; /// Scope containing the variables, entered by the name analysis. std::shared_ptr symbols; + block(std::vector&& constants, + std::vector&& variables, + std::vector&& statements); block(std::vector&& variables, std::vector&& statements); block(const block&) = delete; block(block&& that) noexcept = default; @@ -175,6 +180,7 @@ namespace elna::boot struct parser_visitor { virtual void visit(variable_declaration *) = 0; + virtual void visit(constant_declaration *) = 0; virtual void visit(procedure_declaration *) = 0; virtual void visit(type_declaration *) = 0; virtual void visit(procedure_call *) = 0; @@ -235,6 +241,7 @@ namespace elna::boot [[noreturn]] void visit(extern_type_expression *) override; [[noreturn]] void visit(variable_declaration *) override; + [[noreturn]] void visit(constant_declaration *) override; [[noreturn]] void visit(procedure_declaration *) override; [[noreturn]] void visit(assign_statement *) override; [[noreturn]] void visit(if_statement *) override; @@ -284,6 +291,7 @@ namespace elna::boot void visit(extern_type_expression *) override; void visit(variable_declaration *) override; + void visit(constant_declaration *) override; void visit(procedure_declaration *) override; void visit(assign_statement *statement) override; void visit(if_statement *statement) override; @@ -747,6 +755,22 @@ namespace elna::boot type_expression& underlying_type(); }; + /** + * Constant definition. + */ + class constant_declaration : public declaration + { + public: + const identifier_definition identifier; + expression *const initializer; + + constant_declaration(const source_position position, identifier_definition identifier, + expression *initializer); + ~constant_declaration() override; + + void accept(parser_visitor *visitor) override; + }; + /** * Cast expression. */ diff --git a/include/elna/boot/materialization.h b/include/elna/boot/materialization.h index 74b4133..7436c45 100644 --- a/include/elna/boot/materialization.h +++ b/include/elna/boot/materialization.h @@ -30,7 +30,8 @@ namespace elna::boot real_overflow, local_export, local_extern, - variable_generic + variable_generic, + constant_generic }; materialization_error(const source_position position, kind error_kind); @@ -52,6 +53,7 @@ namespace elna::boot void visit(unit *unit) override; void visit(procedure_declaration *declaration) override; void visit(variable_declaration *declaration) override; + void visit(constant_declaration *declaration) override; void visit(literal *literal) override; void visit(literal *literal) override; diff --git a/include/elna/boot/name_analysis.h b/include/elna/boot/name_analysis.h index 62b91b4..1d9676a 100644 --- a/include/elna/boot/name_analysis.h +++ b/include/elna/boot/name_analysis.h @@ -200,6 +200,7 @@ namespace elna::boot void visit(unit *unit) override; void visit(type_declaration *declaration) override; void visit(variable_declaration *) override; + void visit(constant_declaration *) override; void visit(procedure_declaration *) override; }; @@ -351,6 +352,8 @@ namespace elna::boot std::filesystem::path redefinition_file(const std::shared_ptr& original) const; std::shared_ptr register_variable(const std::string& name, const type& variable_type, const source_position position, const bool is_extern = false); + std::shared_ptr register_constant(const std::string& name, + const type& constant_type, const constant_value& value, const source_position position); std::optional lookup_pointer_like_field(const std::string& field_name, const type& element_type); type lookup_field(const type& composite_type, const std::string& field_name); @@ -436,6 +439,7 @@ namespace elna::boot void visit(unit *unit) override; void visit(type_declaration *declaration) override; void visit(variable_declaration *declaration) override; + void visit(constant_declaration *declaration) override; void visit(procedure_declaration *declaration) override; [[noreturn]] void visit(for_statement *) override; @@ -456,6 +460,7 @@ namespace elna::boot void visit(unit *unit) override; void visit(type_declaration *) override; void visit(variable_declaration *declaration) override; + void visit(constant_declaration *declaration) override; void visit(procedure_declaration *declaration) override; void visit(for_statement *statement) override; diff --git a/include/elna/boot/symbol.h b/include/elna/boot/symbol.h index bdac269..190a297 100644 --- a/include/elna/boot/symbol.h +++ b/include/elna/boot/symbol.h @@ -277,6 +277,7 @@ namespace elna::boot class procedure_info; class variable_info; class label_info; + class constant_info; class info : public std::enable_shared_from_this { @@ -292,6 +293,7 @@ namespace elna::boot virtual std::shared_ptr is_procedure(); virtual std::shared_ptr is_variable(); virtual std::shared_ptr is_label(); + virtual std::shared_ptr is_constant(); }; /** @@ -513,6 +515,29 @@ namespace elna::boot std::shared_ptr is_variable() override; }; + /** + * Constant symbol information. + */ + class constant_info : public info + { + public: + /// Constant type. + const type symbol; + + /// Evaluated constant value. + const constant_value value; + + /** + * Constructs constant symbol information. + * + * \param symbol Constant type. + * \param value Evaluated constant value. + */ + constant_info(const type& symbol, const constant_value& value); + + std::shared_ptr is_constant() override; + }; + /** * Named block a break-statement can jump to. */ diff --git a/include/elna/boot/validation.h b/include/elna/boot/validation.h index 2af68e0..028b0dd 100644 --- a/include/elna/boot/validation.h +++ b/include/elna/boot/validation.h @@ -59,6 +59,7 @@ namespace elna::boot void visit(unit *unit) override; void visit(type_declaration *declaration) override; void visit(variable_declaration *) override; + void visit(constant_declaration *) override; void visit(procedure_declaration *declaration) override; void visit(case_statement *statement) override; diff --git a/include/elna/gcc/elna-generic.h b/include/elna/gcc/elna-generic.h index f942f81..6fc395e 100644 --- a/include/elna/gcc/elna-generic.h +++ b/include/elna/gcc/elna-generic.h @@ -82,6 +82,7 @@ namespace elna::gcc void visit(boot::type_declaration *) override; void visit(boot::variable_declaration *declaration) override; + void visit(boot::constant_declaration *declaration) override; void visit(boot::procedure_declaration *) override; void visit(boot::procedure_call *call) override; void visit(boot::cast_expression *expression) override; -- cgit v1.2.3