aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/elna/boot/ast.h24
-rw-r--r--include/elna/boot/materialization.h4
-rw-r--r--include/elna/boot/name_analysis.h5
-rw-r--r--include/elna/boot/symbol.h25
-rw-r--r--include/elna/boot/validation.h1
-rw-r--r--include/elna/gcc/elna-generic.h1
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;