#include "Compiler.hpp" #include "src/Node.hpp" #include "src/Program.hpp" namespace zn { /*explicit*/ Compiler::Compiler(Logger& logger, SymTable& sym) : m_logger { logger } , m_sym { sym } { } /*virtual*/ Compiler::~Compiler() { } void Compiler::compile(Node const& node, Program& program) { switch (node.type()) { // MODULES // ======= case NODE_MODULE: { for (size_t i=0; iprototype) { auto ref = std::make_shared(TYPE_REF, node.loc(), (int) sym->addr); size_t val = program.add_constant(ref); program.append(OPCODE_LOAD_CONST, val); } else { program.append(OPCODE_LOAD_LOCAL, sym->addr); } } break; case NODE_INT: { size_t addr = program .add_constant(std::make_shared (TYPE_INT, node.loc(), std::stoi(node.repr()))); program.append(OPCODE_LOAD_CONST, addr); } break; default: { std::cerr << "cannot compile node '" << node.string() << "'" << std::endl; abort(); } break; } } }