Save procedure info in the symbol table

This commit is contained in:
2025-03-31 12:48:30 +02:00
parent f2e2da4a34
commit 013bf91fbd
4 changed files with 96 additions and 77 deletions

View File

@ -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);