diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-09-13 16:07:11 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-09-13 16:07:11 +0200 |
| commit | a5d033df465ca8de8457926cc64aacf38c6ae848 (patch) | |
| tree | e459e27e808046ea42448768394574f3343f7015 /boot/validation.cc | |
| parent | e72e20e025ab14320c79c2dca75721a0a5e002bd (diff) | |
| download | elna-a5d033df465ca8de8457926cc64aacf38c6ae848.tar.gz | |
Visit nested statements in validation visitor
Diffstat (limited to 'boot/validation.cc')
| -rw-r--r-- | boot/validation.cc | 117 |
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 *) + { + } } |
