Support variable declaration initializer
This commit is contained in:
@@ -83,6 +83,16 @@ namespace elna::boot
|
||||
return "Procedure '" + identifier + "' is expected to return, but does not have a return statement";
|
||||
}
|
||||
|
||||
variable_initializer_error::variable_initializer_error(const char *path, const struct position position)
|
||||
: error(path, position)
|
||||
{
|
||||
}
|
||||
|
||||
std::string variable_initializer_error::what() const
|
||||
{
|
||||
return "Only one variable can be initialized";
|
||||
}
|
||||
|
||||
type_analysis_visitor::type_analysis_visitor(const char *path)
|
||||
: error_container(path)
|
||||
{
|
||||
@@ -289,7 +299,10 @@ namespace elna::boot
|
||||
{
|
||||
declaration->variable_type().accept(this);
|
||||
|
||||
this->bag.enter(declaration->identifier.identifier, std::make_shared<variable_info>(this->current_type));
|
||||
for (const auto& variable_identifier : declaration->identifiers)
|
||||
{
|
||||
this->bag.enter(variable_identifier.identifier, std::make_shared<variable_info>(this->current_type));
|
||||
}
|
||||
}
|
||||
|
||||
void name_analysis_visitor::visit(constant_declaration *definition)
|
||||
@@ -584,5 +597,33 @@ namespace elna::boot
|
||||
add_error<already_declared_error>(type->identifier.identifier, this->input_file, type->position());
|
||||
}
|
||||
}
|
||||
for (variable_declaration *const variable : unit->variables)
|
||||
{
|
||||
variable->accept(this);
|
||||
}
|
||||
for (procedure_declaration *const procedure : unit->procedures)
|
||||
{
|
||||
procedure->accept(this);
|
||||
}
|
||||
}
|
||||
|
||||
void declaration_visitor::visit(variable_declaration *declaration)
|
||||
{
|
||||
if (declaration->body != nullptr && declaration->identifiers.size() > 1)
|
||||
{
|
||||
add_error<variable_initializer_error>(this->input_file, declaration->position());
|
||||
}
|
||||
}
|
||||
|
||||
void declaration_visitor::visit(procedure_declaration *definition)
|
||||
{
|
||||
if (!definition->body.has_value())
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (boot::variable_declaration *const variable : definition->body.value().variables())
|
||||
{
|
||||
variable->accept(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user