aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/elna/frontend/ast.h49
-rw-r--r--include/elna/frontend/semantic.h6
-rw-r--r--include/elna/gcc/elna-generic.h2
3 files changed, 22 insertions, 35 deletions
diff --git a/include/elna/frontend/ast.h b/include/elna/frontend/ast.h
index bbb8a36..0b5f3d7 100644
--- a/include/elna/frontend/ast.h
+++ b/include/elna/frontend/ast.h
@@ -71,14 +71,14 @@ namespace elna::frontend
class program;
class binary_expression;
class unary_expression;
- class named_type_expression;
+ class type_expression;
class array_type_expression;
class pointer_type_expression;
class record_type_expression;
class union_type_expression;
class procedure_type_expression;
class enumeration_type_expression;
- class variable_expression;
+ class named_expression;
class array_access_expression;
class field_access_expression;
class dereference_expression;
@@ -111,14 +111,14 @@ namespace elna::frontend
virtual void visit(program *) = 0;
virtual void visit(binary_expression *) = 0;
virtual void visit(unary_expression *) = 0;
- virtual void visit(named_type_expression *) = 0;
+ virtual void visit(type_expression *) = 0;
virtual void visit(array_type_expression *) = 0;
virtual void visit(pointer_type_expression *) = 0;
virtual void visit(record_type_expression *) = 0;
virtual void visit(union_type_expression *) = 0;
virtual void visit(procedure_type_expression *) = 0;
virtual void visit(enumeration_type_expression *) = 0;
- virtual void visit(variable_expression *) = 0;
+ virtual void visit(named_expression *) = 0;
virtual void visit(array_access_expression *) = 0;
virtual void visit(field_access_expression *) = 0;
virtual void visit(dereference_expression *) = 0;
@@ -139,7 +139,7 @@ namespace elna::frontend
[[noreturn]] void not_implemented();
public:
- [[noreturn]] virtual void visit(named_type_expression *) override;
+ [[noreturn]] virtual void visit(type_expression *) override;
[[noreturn]] virtual void visit(array_type_expression *) override;
[[noreturn]] virtual void visit(pointer_type_expression *) override;
[[noreturn]] virtual void visit(program *) override;
@@ -165,7 +165,7 @@ namespace elna::frontend
[[noreturn]] virtual void visit(traits_expression *) override;
[[noreturn]] virtual void visit(binary_expression *) override;
[[noreturn]] virtual void visit(unary_expression *) override;
- [[noreturn]] virtual void visit(variable_expression *) override;
+ [[noreturn]] virtual void visit(named_expression *) override;
[[noreturn]] virtual void visit(array_access_expression *) override;
[[noreturn]] virtual void visit(field_access_expression *) override;
[[noreturn]] virtual void visit(dereference_expression *) override;
@@ -232,10 +232,10 @@ namespace elna::frontend
/**
* Some type expression.
*/
- class type_expression : public node
+ class type_expression : public virtual node
{
public:
- virtual named_type_expression *is_named();
+ virtual named_expression *is_named();
virtual array_type_expression *is_array();
virtual pointer_type_expression *is_pointer();
virtual record_type_expression *is_record();
@@ -243,21 +243,8 @@ namespace elna::frontend
virtual procedure_type_expression *is_procedure();
virtual enumeration_type_expression *is_enumeration();
- protected:
- type_expression(const struct position position);
- };
-
- /**
- * Expression refering to a type by its name.
- */
- class named_type_expression : public type_expression
- {
- public:
- const std::string name;
-
- named_type_expression(const struct position position, const std::string& name);
void accept(parser_visitor *visitor) override;
- named_type_expression *is_named() override;
+ ~type_expression() = 0;
};
class array_type_expression : public type_expression
@@ -363,9 +350,6 @@ namespace elna::frontend
{
public:
literal_expression *is_literal() override;
-
- protected:
- literal_expression();
};
/**
@@ -407,6 +391,7 @@ namespace elna::frontend
{
block(std::vector<constant_declaration*>&& constants, std::vector<variable_declaration *>&& variables,
std::vector<statement *>&& body);
+ block(std::vector<constant_declaration*>&& constants, std::vector<variable_declaration *>&& variables);
block(const block&) = delete;
block(block&& that);
@@ -553,7 +538,7 @@ namespace elna::frontend
class designator_expression : public expression
{
public:
- virtual variable_expression *is_variable();
+ virtual named_expression *is_named();
virtual array_access_expression *is_array_access();
virtual field_access_expression *is_field_access();
virtual dereference_expression *is_dereference();
@@ -561,20 +546,20 @@ namespace elna::frontend
designator_expression *is_designator() override;
void accept(parser_visitor *visitor);
~designator_expression() = 0;
-
- protected:
- designator_expression();
};
- class variable_expression : public designator_expression, public literal_expression
+ /**
+ * Expression refering to an entity by its name.
+ */
+ class named_expression : public designator_expression, public type_expression
{
public:
const std::string name;
- variable_expression(const struct position position, const std::string& name);
+ named_expression(const struct position position, const std::string& name);
void accept(parser_visitor *visitor) override;
- variable_expression *is_variable() override;
+ named_expression *is_named() override;
};
class array_access_expression : public designator_expression
diff --git a/include/elna/frontend/semantic.h b/include/elna/frontend/semantic.h
index 8a295e4..887b660 100644
--- a/include/elna/frontend/semantic.h
+++ b/include/elna/frontend/semantic.h
@@ -127,11 +127,13 @@ namespace elna::frontend
procedure_type build_procedure(procedure_type_expression& type_expression);
std::vector<type_field> build_composite_type(const std::vector<field_declaration>& fields);
+ std::shared_ptr<variable_info> register_variable(const std::string& name,
+ const bool is_extern, const struct position position);
public:
name_analysis_visitor(const char *path, symbol_bag bag);
- void visit(named_type_expression *type_expression) override;
+ void visit(type_expression *) override;
void visit(array_type_expression *type_expression) override;
void visit(pointer_type_expression *type_expression) override;
void visit(program *program) override;
@@ -157,7 +159,7 @@ namespace elna::frontend
void visit(traits_expression *trait) override;
void visit(binary_expression *expression) override;
void visit(unary_expression *expression) override;
- void visit(variable_expression *) override;
+ void visit(named_expression *type_expression) override;
void visit(array_access_expression *expression) override;
void visit(field_access_expression *expression) override;
void visit(dereference_expression *expression) override;
diff --git a/include/elna/gcc/elna-generic.h b/include/elna/gcc/elna-generic.h
index 97cd512..ec6f32f 100644
--- a/include/elna/gcc/elna-generic.h
+++ b/include/elna/gcc/elna-generic.h
@@ -81,7 +81,7 @@ namespace elna::gcc
void visit(frontend::unary_expression *expression) override;
void visit(frontend::constant_declaration *definition) override;
void visit(frontend::variable_declaration *declaration) override;
- void visit(frontend::variable_expression *expression) override;
+ void visit(frontend::named_expression *expression) override;
void visit(frontend::array_access_expression *expression) override;
void visit(frontend::field_access_expression *expression) override;
void visit(frontend::dereference_expression *expression) override;