Declare an additional name analysis visitor
This commit is contained in:
@ -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;
|
||||
};
|
||||
}
|
||||
|
Reference in New Issue
Block a user