Declare an additional name analysis visitor

This commit is contained in:
2025-06-20 22:33:37 +02:00
parent 6da2a70329
commit 67a8d2c057
4 changed files with 312 additions and 74 deletions

View File

@ -30,7 +30,7 @@ namespace elna::boot
{
class undeclared_error : public error
{
std::string identifier;
const std::string identifier;
public:
undeclared_error(const std::string& identifier, const char *path, const struct position position);
@ -40,7 +40,7 @@ namespace elna::boot
class already_declared_error : public error
{
std::string identifier;
const std::string identifier;
public:
already_declared_error(const std::string& identifier, const char *path, const struct position position);
@ -50,7 +50,7 @@ namespace elna::boot
class field_duplication_error : public error
{
std::string field_name;
const std::string field_name;
public:
field_duplication_error(const std::string& field_name, const char *path, const struct position);
@ -58,7 +58,20 @@ namespace elna::boot
std::string what() const override;
};
class declaration_visitor final : public parser_visitor, public error_container
class cyclic_declaration_error : public error
{
const std::vector<std::string> cycle;
public:
cyclic_declaration_error(const std::vector<std::string>& cycle, const char *path, const struct position);
std::string what() const override;
};
/**
* Performs name analysis.
*/
class name_analysis_visitor final : public parser_visitor, public error_container
{
type current_type;
constant_info::variant current_literal;
@ -70,7 +83,8 @@ namespace elna::boot
std::vector<type_field> build_composite_type(const std::vector<field_declaration>& fields);
public:
explicit declaration_visitor(const char *path, std::shared_ptr<symbol_table> symbols);
explicit name_analysis_visitor(const char *path, std::shared_ptr<symbol_table> symbols,
std::unordered_map<std::string, std::shared_ptr<alias_type>>&& unresolved);
void visit(named_type_expression *type_expression) override;
void visit(array_type_expression *type_expression) override;
@ -110,4 +124,53 @@ namespace elna::boot
void visit(literal<std::nullptr_t> *literal) override;
void visit(literal<std::string> *literal) override;
};
/**
* Collects global declarations.
*/
class declaration_visitor final : public parser_visitor, public error_container
{
public:
std::unordered_map<std::string, std::shared_ptr<alias_type>> unresolved;
explicit declaration_visitor(const char *path);
void visit(named_type_expression *) override;
void visit(array_type_expression *) override;
void visit(pointer_type_expression *) override;
void visit(program *program) override;
void visit(type_declaration *) override;
void visit(record_type_expression *) override;
void visit(union_type_expression *) override;
void visit(procedure_type_expression *) override;
void visit(enumeration_type_expression *) override;
void visit(variable_declaration *) override;
void visit(constant_declaration *) override;
void visit(procedure_declaration *) override;
void visit(assign_statement *) override;
void visit(if_statement *) override;
void visit(import_declaration *) override;
void visit(while_statement *) override;
void visit(return_statement *) override;
void visit(defer_statement *) override;
void visit(case_statement *) override;
void visit(procedure_call *) override;
void visit(unit *unit) override;
void visit(cast_expression *) override;
void visit(traits_expression *) override;
void visit(binary_expression *) override;
void visit(unary_expression *) override;
void visit(variable_expression *) override;
void visit(array_access_expression *) override;
void visit(field_access_expression *) override;
void visit(dereference_expression *) override;
void visit(literal<std::int32_t> *) override;
void visit(literal<std::uint32_t> *) override;
void visit(literal<double> *) override;
void visit(literal<bool> *) override;
void visit(literal<unsigned char> *) override;
void visit(literal<std::nullptr_t> *) override;
void visit(literal<std::string> *) override;
};
}