diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/elna/frontend/ast.h | 49 | ||||
| -rw-r--r-- | include/elna/frontend/semantic.h | 6 | ||||
| -rw-r--r-- | include/elna/gcc/elna-generic.h | 2 |
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; |
