From 47521ad6d85f9bd6caee39696ce40dff82cfa50d Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Wed, 2 Sep 2026 13:31:04 +0200 Subject: Implement program entry point --- include/elna/boot/ast.h | 19 ++++++++++++++----- include/elna/boot/name_analysis.h | 15 +++++++++------ include/elna/boot/type_check.h | 1 - 3 files changed, 23 insertions(+), 12 deletions(-) (limited to 'include') 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 variables; - const std::vector entry_point; + const std::vector statements; expression *const return_expression{ nullptr }; procedure_body(std::vector&& 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 imports; const std::vector types; const std::vector procedures; + const std::vector variables; + const std::optional entry_point; + const std::vector parameters; - unit(const source_position position); + unit(const source_position position, + std::vector&& imports, + std::vector&& types, + std::vector&& variables, + std::vector&& procedures); unit(const source_position position, std::vector&& imports, std::vector&& types, std::vector&& variables, std::vector&& procedures, - std::vector&& entry_point); - bool has_body() const; + std::optional&& 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; - 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 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; - const_qualifier_error(const source_position position, payload_type payload); + declaration_format_error(const source_position position, payload_type payload); std::optional 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> build_procedure( procedure_type_expression& expression); ordered_map build_composite_type(const std::vector& 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; -- cgit v1.2.3