Save procedure info in the symbol table
This commit is contained in:
@ -46,6 +46,33 @@ namespace elna::boot
|
||||
{
|
||||
}
|
||||
|
||||
procedure_type declaration_visitor::build_procedure(procedure_type_expression& type_expression)
|
||||
{
|
||||
procedure_type::return_t result_return;
|
||||
|
||||
if (type_expression.return_type.no_return)
|
||||
{
|
||||
result_return = procedure_type::return_t(std::monostate{});
|
||||
}
|
||||
else if (type_expression.return_type.proper_type != nullptr)
|
||||
{
|
||||
type_expression.return_type.proper_type->accept(this);
|
||||
result_return = procedure_type::return_t(this->current_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
result_return = procedure_type::return_t();
|
||||
}
|
||||
procedure_type result_type = procedure_type(result_return);
|
||||
|
||||
for (std::shared_ptr<struct type_expression> parameter : type_expression.parameters)
|
||||
{
|
||||
parameter->accept(this);
|
||||
result_type.parameters.push_back(this->current_type);
|
||||
}
|
||||
return result_type;
|
||||
}
|
||||
|
||||
void declaration_visitor::visit(program *program)
|
||||
{
|
||||
for (type_definition *const type : program->types)
|
||||
@ -134,7 +161,7 @@ namespace elna::boot
|
||||
{
|
||||
auto result_type = std::make_shared<union_type>();
|
||||
|
||||
for (auto& field : type_expression->fields)
|
||||
for (const field_declaration& field : type_expression->fields)
|
||||
{
|
||||
field.second->accept(this);
|
||||
result_type->fields.push_back(std::make_pair(field.first, this->current_type));
|
||||
@ -144,26 +171,10 @@ namespace elna::boot
|
||||
|
||||
void declaration_visitor::visit(procedure_type_expression *type_expression)
|
||||
{
|
||||
std::shared_ptr<procedure_type> result_type;
|
||||
std::shared_ptr<procedure_type> result_type =
|
||||
std::make_shared<procedure_type>(std::move(build_procedure(*type_expression)));
|
||||
|
||||
if (type_expression->return_type.no_return)
|
||||
{
|
||||
result_type = std::make_shared<procedure_type>(procedure_type::return_t(std::monostate{}));
|
||||
}
|
||||
else if (type_expression->return_type.proper_type != nullptr)
|
||||
{
|
||||
type_expression->return_type.proper_type->accept(this);
|
||||
result_type = std::make_shared<procedure_type>(procedure_type::return_t(this->current_type));
|
||||
}
|
||||
else
|
||||
{
|
||||
result_type = std::make_shared<procedure_type>(procedure_type::return_t());
|
||||
}
|
||||
for (auto& parameter : type_expression->parameters)
|
||||
{
|
||||
parameter->accept(this);
|
||||
result_type->parameters.push_back(this->current_type);
|
||||
}
|
||||
this->current_type = type(result_type);
|
||||
}
|
||||
|
||||
void declaration_visitor::visit(variable_declaration *declaration)
|
||||
@ -177,14 +188,10 @@ namespace elna::boot
|
||||
|
||||
void declaration_visitor::visit(procedure_definition *definition)
|
||||
{
|
||||
for (auto heading_parameter : definition->heading().parameters)
|
||||
{
|
||||
heading_parameter->accept(this);
|
||||
}
|
||||
if (definition->heading().return_type.proper_type != nullptr)
|
||||
{
|
||||
definition->heading().return_type.proper_type->accept(this);
|
||||
}
|
||||
std::shared_ptr<procedure_info> info = std::make_shared<procedure_info>(
|
||||
build_procedure(definition->heading()), definition->parameter_names);
|
||||
|
||||
this->symbols->enter(definition->identifier, info);
|
||||
if (definition->body != nullptr)
|
||||
{
|
||||
definition->body->accept(this);
|
||||
|
Reference in New Issue
Block a user