aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-09-02 13:31:04 +0200
committerEugen Wissner <belka@caraus.de>2026-09-07 10:53:02 +0200
commit47521ad6d85f9bd6caee39696ce40dff82cfa50d (patch)
treecf5813033a440c6ac374948894d5dd70e0712cdb /include
parent0fada11e99da430e9a056e46da9f0e110df6c45c (diff)
downloadelna-47521ad6d85f9bd6caee39696ce40dff82cfa50d.tar.gz
Implement program entry point
Diffstat (limited to 'include')
-rw-r--r--include/elna/boot/ast.h19
-rw-r--r--include/elna/boot/name_analysis.h15
-rw-r--r--include/elna/boot/type_check.h1
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;