aboutsummaryrefslogtreecommitdiff
path: root/boot/validation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/validation.cc')
-rw-r--r--boot/validation.cc117
1 files changed, 71 insertions, 46 deletions
diff --git a/boot/validation.cc b/boot/validation.cc
index 91dc064..2125a99 100644
--- a/boot/validation.cc
+++ b/boot/validation.cc
@@ -41,51 +41,36 @@ namespace elna::boot
{
}
- void validation_visitor::visit(assign_statement *)
- {
- }
-
- void validation_visitor::visit(if_statement *)
- {
- }
-
- void validation_visitor::visit(while_statement *)
- {
- }
-
- void validation_visitor::visit(repeat_statement *)
- {
- }
-
- void validation_visitor::visit(for_statement *)
+ void validation_visitor::visit_statements(const std::vector<statement *>& statements)
{
+ for (statement *const body_statement : statements)
+ {
+ body_statement->accept(this);
+ }
}
- void validation_visitor::visit(defer_statement *)
+ void validation_visitor::visit(unit *unit)
{
- }
+ for (declaration *unit_declaration : unit->declarations)
+ {
+ unit_declaration->accept(this);
+ }
+ if (unit->entry_point.has_value())
+ {
+ auto entry_point = this->bag.lookup("")->is_procedure();
- void validation_visitor::visit(empty_statement *)
- {
+ this->bag.enter(entry_point->scope);
+ visit_statements(unit->entry_point->statements);
+ this->bag.leave();
+ }
}
- void validation_visitor::visit(procedure_call *)
+ void validation_visitor::visit(type_declaration *)
{
}
- void validation_visitor::visit(unit *unit)
+ void validation_visitor::visit(variable_declaration *)
{
- for (procedure_declaration *procedure : unit->procedures)
- {
- procedure->accept(this);
- }
- if (unit->entry_point.has_value())
- {
- for (auto *entry_statement : unit->entry_point->statements)
- {
- entry_statement->accept(this);
- }
- }
}
void validation_visitor::visit(procedure_declaration *declaration)
@@ -94,10 +79,7 @@ namespace elna::boot
{
auto procedure = this->bag.lookup(declaration->identifier.name())->is_procedure();
this->bag.enter(procedure->scope);
- for (auto *statement : declaration->body.value().statements)
- {
- statement->accept(this);
- }
+ visit_statements(declaration->body.value().statements);
this->bag.leave();
}
}
@@ -106,17 +88,11 @@ namespace elna::boot
{
for (const switch_case& case_block : statement->cases)
{
- for (auto *block_statement : case_block.statements)
- {
- block_statement->accept(this);
- }
+ visit_statements(case_block.statements);
}
if (statement->alternative != nullptr)
{
- for (auto *block_statement : *statement->alternative)
- {
- block_statement->accept(this);
- }
+ visit_statements(*statement->alternative);
}
std::unordered_map<constant_value, source_position, constant_value_hash> seen;
@@ -139,4 +115,53 @@ namespace elna::boot
}
}
}
+
+ void validation_visitor::visit(assign_statement *)
+ {
+ }
+
+ void validation_visitor::visit(if_statement *statement)
+ {
+ visit_statements(statement->branch().statements);
+ for (const conditional_statements *branch : statement->branches)
+ {
+ visit_statements(branch->statements);
+ }
+ if (statement->alternative != nullptr)
+ {
+ visit_statements(*statement->alternative);
+ }
+ }
+
+ void validation_visitor::visit(while_statement *statement)
+ {
+ visit_statements(statement->branch().statements);
+ for (const conditional_statements *branch : statement->branches)
+ {
+ visit_statements(branch->statements);
+ }
+ }
+
+ void validation_visitor::visit(repeat_statement *statement)
+ {
+ visit_statements(statement->body);
+ }
+
+ void validation_visitor::visit(for_statement *statement)
+ {
+ visit_statements(statement->body);
+ }
+
+ void validation_visitor::visit(defer_statement *statement)
+ {
+ visit_statements(statement->statements);
+ }
+
+ void validation_visitor::visit(empty_statement *)
+ {
+ }
+
+ void validation_visitor::visit(procedure_call *)
+ {
+ }
}