diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-09-02 13:31:04 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-09-07 10:53:02 +0200 |
| commit | 47521ad6d85f9bd6caee39696ce40dff82cfa50d (patch) | |
| tree | cf5813033a440c6ac374948894d5dd70e0712cdb /include | |
| parent | 0fada11e99da430e9a056e46da9f0e110df6c45c (diff) | |
| download | elna-47521ad6d85f9bd6caee39696ce40dff82cfa50d.tar.gz | |
Implement program entry point
Diffstat (limited to 'include')
| -rw-r--r-- | include/elna/boot/ast.h | 19 | ||||
| -rw-r--r-- | include/elna/boot/name_analysis.h | 15 | ||||
| -rw-r--r-- | include/elna/boot/type_check.h | 1 |
3 files changed, 23 insertions, 12 deletions
diff --git a/include/elna/boot/ast.h b/include/elna/boot/ast.h index f959936..c485dc7 100644 --- a/include/elna/boot/ast.h +++ b/include/elna/boot/ast.h @@ -579,7 +579,7 @@ namespace elna::boot struct procedure_body { const std::vector<variable_declaration *> variables; - const std::vector<statement *> entry_point; + const std::vector<statement *> statements; expression *const return_expression{ nullptr }; procedure_body(std::vector<variable_declaration *>&& variables, @@ -593,6 +593,8 @@ namespace elna::boot virtual ~procedure_body(); }; + void traverse_body(parser_visitor *visitor, const procedure_body& body); + /** * Procedure definition. */ @@ -940,21 +942,28 @@ namespace elna::boot /** * Stores module-level definitions. */ - class unit : public node, public procedure_body + class unit : public node { public: const std::vector<import_declaration *> imports; const std::vector<type_declaration *> types; const std::vector<procedure_declaration *> procedures; + const std::vector<variable_declaration *> variables; + const std::optional<procedure_body> entry_point; + const std::vector<identifier> parameters; - unit(const source_position position); + unit(const source_position position, + std::vector<import_declaration *>&& imports, + std::vector<type_declaration *>&& types, + std::vector<variable_declaration *>&& variables, + std::vector<procedure_declaration *>&& procedures); unit(const source_position position, std::vector<import_declaration *>&& imports, std::vector<type_declaration *>&& types, std::vector<variable_declaration *>&& variables, std::vector<procedure_declaration *>&& procedures, - std::vector<statement *>&& entry_point); - bool has_body() const; + std::optional<procedure_body>&& body); + void accept(parser_visitor *visitor) override; ~unit() override; diff --git a/include/elna/boot/name_analysis.h b/include/elna/boot/name_analysis.h index 8e945b2..cf35ab6 100644 --- a/include/elna/boot/name_analysis.h +++ b/include/elna/boot/name_analysis.h @@ -35,7 +35,7 @@ namespace elna::boot * Error declaring or using a symbol (undeclared, redefinition, * local export). */ - class declaration_error final : public diagnostic + class symbol_declaration_error final : public diagnostic { public: enum class kind @@ -56,7 +56,7 @@ namespace elna::boot }; using payload_type = std::variant<redefinition, kind>; - declaration_error(const source_position position, const std::string& name, payload_type payload); + symbol_declaration_error(const source_position position, const std::string& name, payload_type payload); std::string what() const override; std::optional<diagnostic_note> note() const override; @@ -80,15 +80,16 @@ namespace elna::boot }; /** - * \c const qualifier used incorrectly — wrong position or duplicate. + * Invalid declaration format. */ - class const_qualifier_error final : public diagnostic + class declaration_format_error final : public diagnostic { public: enum class kind { array_position, - duplicate + duplicate, + module_entry }; struct not_initialized { @@ -96,7 +97,7 @@ namespace elna::boot }; using payload_type = std::variant<not_initialized, kind>; - const_qualifier_error(const source_position position, payload_type payload); + declaration_format_error(const source_position position, payload_type payload); std::optional<diagnostic_note> note() const override; std::string what() const override; @@ -173,6 +174,8 @@ namespace elna::boot resolving_visitor(symbol_bag& bag, const target_info& target, const std::filesystem::path& module_path); + procedure_type::return_t build_return_type( + const procedure_type_expression::return_t& return_type); std::pair<procedure_type, std::vector<std::string>> build_procedure( procedure_type_expression& expression); ordered_map<type> build_composite_type(const std::vector<field_declaration>& fields, diff --git a/include/elna/boot/type_check.h b/include/elna/boot/type_check.h index fea7e49..345ef9d 100644 --- a/include/elna/boot/type_check.h +++ b/include/elna/boot/type_check.h @@ -219,7 +219,6 @@ namespace elna::boot explicit type_analysis_visitor(symbol_bag bag, const target_info& target); void visit(procedure_declaration *declaration) override; - void visit(unit *unit) override; void visit(assign_statement *statement) override; void visit(variable_declaration *declaration) override; void visit(type_declaration *declaration) override; |
