#include "elna/source/semantic.hpp" #include namespace elna::source { void name_analysis_visitor::visit(constant_definition *definition) { this->table->enter(definition->identifier(), std::make_shared(constant_info(definition->body().number()))); } void name_analysis_visitor::visit(declaration *declaration) { this->table->enter(declaration->identifier(), std::make_shared(variable_info())); } void name_analysis_visitor::visit(block *block) { this->table = block->table(); empty_visitor::visit(block); this->table->enter("main", std::make_shared()); } void allocator_visitor::visit(declaration *declaration) { this->offset -= sizeof(std::int32_t); } void allocator_visitor::visit(block *block) { this->offset = 0; empty_visitor::visit(block); std::dynamic_pointer_cast(block->table()->lookup("main")) ->stack_size(std::abs(this->offset)); } }