diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-10-09 23:35:03 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-10-09 23:35:03 +0200 |
| commit | da1e84e33de1a9c2cc1745b8f42bc7f0cee8fc5c (patch) | |
| tree | 6222ecd61c9d6e9d59c6169b99e4a24a5d347fea /include | |
| parent | 134d3ac4caff6d87c79b0892e57073594cb0064c (diff) | |
| download | elna-da1e84e33de1a9c2cc1745b8f42bc7f0cee8fc5c.tar.gz | |
Add const sections
Diffstat (limited to 'include')
| -rw-r--r-- | include/elna/boot/ast.h | 24 | ||||
| -rw-r--r-- | include/elna/boot/materialization.h | 4 | ||||
| -rw-r--r-- | include/elna/boot/name_analysis.h | 5 | ||||
| -rw-r--r-- | include/elna/boot/symbol.h | 25 | ||||
| -rw-r--r-- | include/elna/boot/validation.h | 1 | ||||
| -rw-r--r-- | include/elna/gcc/elna-generic.h | 1 |
6 files changed, 59 insertions, 1 deletions
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<constant_declaration *> constants; std::vector<variable_declaration *> variables; std::vector<statement *> statements; /// Scope containing the variables, entered by the name analysis. std::shared_ptr<symbol_table> symbols; + block(std::vector<constant_declaration *>&& constants, + std::vector<variable_declaration *>&& variables, + std::vector<statement *>&& statements); block(std::vector<variable_declaration *>&& variables, std::vector<statement *>&& 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; @@ -748,6 +756,22 @@ namespace elna::boot }; /** + * 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. */ class cast_expression : public 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<integer_literal> *literal) override; void visit(literal<float_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<info>& original) const; std::shared_ptr<variable_info> register_variable(const std::string& name, const type& variable_type, const source_position position, const bool is_extern = false); + std::shared_ptr<constant_info> register_constant(const std::string& name, + const type& constant_type, const constant_value& value, const source_position position); std::optional<type> 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<info> { @@ -292,6 +293,7 @@ namespace elna::boot virtual std::shared_ptr<procedure_info> is_procedure(); virtual std::shared_ptr<variable_info> is_variable(); virtual std::shared_ptr<label_info> is_label(); + virtual std::shared_ptr<constant_info> is_constant(); }; /** @@ -514,6 +516,29 @@ namespace elna::boot }; /** + * 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<constant_info> is_constant() override; + }; + + /** * Named block a break-statement can jump to. */ class label_info : public info 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; |
