aboutsummaryrefslogtreecommitdiff
path: root/boot/semantic.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/semantic.cc')
-rw-r--r--boot/semantic.cc93
1 files changed, 40 insertions, 53 deletions
diff --git a/boot/semantic.cc b/boot/semantic.cc
index a48226b..0530448 100644
--- a/boot/semantic.cc
+++ b/boot/semantic.cc
@@ -96,11 +96,6 @@ namespace elna::boot
{
}
- void type_analysis_visitor::visit(program *program)
- {
- visit(static_cast<unit *>(program));
- }
-
void type_analysis_visitor::visit(procedure_declaration *definition)
{
if (definition->body.has_value() && definition->heading().return_type.proper_type != nullptr)
@@ -195,17 +190,17 @@ namespace elna::boot
}
std::pair<procedure_type, std::vector<std::string>> name_analysis_visitor::build_procedure(
- procedure_type_expression& type_expression)
+ procedure_type_expression& expression)
{
procedure_type::return_t result_return;
- if (type_expression.return_type.no_return)
+ if (expression.return_type.no_return)
{
result_return = procedure_type::return_t(std::monostate{});
}
- else if (type_expression.return_type.proper_type != nullptr)
+ else if (expression.return_type.proper_type != nullptr)
{
- type_expression.return_type.proper_type->accept(this);
+ expression.return_type.proper_type->accept(this);
result_return = procedure_type::return_t(this->current_type);
}
else
@@ -215,7 +210,7 @@ namespace elna::boot
std::pair<procedure_type, std::vector<std::string>> result_type{
procedure_type(result_return), std::vector<std::string>()
};
- for (auto& [parameter_names, parameters_type] : type_expression.parameters)
+ for (auto& [parameter_names, parameters_type] : expression.parameters)
{
parameters_type->accept(this);
for (auto& parameter_name : parameter_names)
@@ -227,26 +222,6 @@ namespace elna::boot
return result_type;
}
- void name_analysis_visitor::visit(program *program)
- {
- visit(static_cast<unit *>(program));
-
- this->bag.enter();
- auto variable_type = this->bag.lookup("Int")->is_type()->symbol;
- this->bag.enter("count", std::make_shared<variable_info>(variable_type, false));
-
- variable_type = this->bag.lookup("Char")->is_type()->symbol;
- variable_type = type(std::make_shared<pointer_type>(variable_type));
- variable_type = type(std::make_shared<pointer_type>(variable_type));
- this->bag.enter("parameters", std::make_shared<variable_info>(variable_type, false));
-
- for (statement *const statement : program->body)
- {
- statement->accept(this);
- }
- this->bag.leave();
- }
-
void name_analysis_visitor::visit(type_declaration *definition)
{
definition->body().accept(this);
@@ -261,16 +236,16 @@ namespace elna::boot
{
}
- void name_analysis_visitor::visit(pointer_type_expression *type_expression)
+ void name_analysis_visitor::visit(pointer_type_expression *expression)
{
- type_expression->base().accept(this);
+ expression->base().accept(this);
this->current_type = type(std::make_shared<pointer_type>(this->current_type));
}
- void name_analysis_visitor::visit(array_type_expression *type_expression)
+ void name_analysis_visitor::visit(array_type_expression *expression)
{
- type_expression->base().accept(this);
- auto result_type{ std::make_shared<array_type>(this->current_type, type_expression->size) };
+ expression->base().accept(this);
+ auto result_type = std::make_shared<array_type>(this->current_type, expression->size);
this->current_type = type(result_type);
}
@@ -299,16 +274,16 @@ namespace elna::boot
return result;
}
- void name_analysis_visitor::visit(record_type_expression *type_expression)
+ void name_analysis_visitor::visit(record_type_expression *expression)
{
std::shared_ptr<record_type> result_type;
- if (type_expression->base.has_value())
+ if (expression->base.has_value())
{
- if (auto unresolved_alias = this->bag.declared(type_expression->base.value()))
+ if (auto unresolved_alias = this->bag.declared(expression->base.value()))
{
result_type = std::make_shared<record_type>(type(unresolved_alias));
}
- else if (auto base_symbol = this->bag.lookup(type_expression->base.value()))
+ else if (auto base_symbol = this->bag.lookup(expression->base.value()))
{
if (auto base_type_info = base_symbol->is_type())
{
@@ -316,14 +291,14 @@ namespace elna::boot
}
else
{
- add_error<base_type_error>(type_expression->base.value(), type_expression->position());
+ add_error<base_type_error>(expression->base.value(), expression->position());
this->current_type = type();
return;
}
}
else
{
- add_error<undeclared_error>(type_expression->base.value(), type_expression->position());
+ add_error<undeclared_error>(expression->base.value(), expression->position());
this->current_type = type();
return;
}
@@ -332,31 +307,31 @@ namespace elna::boot
{
result_type = std::make_shared<record_type>();
}
- result_type->fields = build_composite_type(type_expression->fields);
+ result_type->fields = build_composite_type(expression->fields);
this->current_type = type(result_type);
}
- void name_analysis_visitor::visit(union_type_expression *type_expression)
+ void name_analysis_visitor::visit(union_type_expression *expression)
{
auto result_type = std::make_shared<union_type>();
- result_type->fields = build_composite_type(type_expression->fields);
+ result_type->fields = build_composite_type(expression->fields);
this->current_type = type(result_type);
}
- void name_analysis_visitor::visit(procedure_type_expression *type_expression)
+ void name_analysis_visitor::visit(procedure_type_expression *expression)
{
std::shared_ptr<procedure_type> result_type =
- std::make_shared<procedure_type>(std::move(build_procedure(*type_expression).first));
+ std::make_shared<procedure_type>(std::move(build_procedure(*expression).first));
this->current_type = type(result_type);
}
- void name_analysis_visitor::visit(enumeration_type_expression *type_expression)
+ void name_analysis_visitor::visit(enumeration_type_expression *expression)
{
- std::shared_ptr<enumeration_type> result_type = std::make_shared<enumeration_type>(type_expression->members);
+ std::shared_ptr<enumeration_type> result_type = std::make_shared<enumeration_type>(expression->members);
this->current_type = type(result_type);
}
@@ -561,6 +536,23 @@ namespace elna::boot
{
procedure->accept(this);
}
+ if (unit->body.has_value())
+ {
+ this->bag.enter();
+ auto variable_type = this->bag.lookup("Int")->is_type()->symbol;
+ this->bag.enter("count", std::make_shared<variable_info>(variable_type, false));
+
+ variable_type = this->bag.lookup("Char")->is_type()->symbol;
+ variable_type = type(std::make_shared<pointer_type>(variable_type));
+ variable_type = type(std::make_shared<pointer_type>(variable_type));
+ this->bag.enter("parameters", std::make_shared<variable_info>(variable_type, false));
+
+ for (statement *const statement : unit->body.value())
+ {
+ statement->accept(this);
+ }
+ this->bag.leave();
+ }
}
void name_analysis_visitor::visit(traits_expression *trait)
@@ -666,11 +658,6 @@ namespace elna::boot
{
}
- void declaration_visitor::visit(program *program)
- {
- visit(static_cast<unit *>(program));
- }
-
void declaration_visitor::visit(import_declaration *)
{
}