43 lines
913 B
C++
43 lines
913 B
C++
|
#include "Compiler.hpp"
|
||
|
#include "src/Node.hpp"
|
||
|
#include "src/Program.hpp"
|
||
|
|
||
|
namespace zn
|
||
|
{
|
||
|
/*explicit*/ Compiler::Compiler(Logger& logger)
|
||
|
: m_logger { logger }
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/*virtual*/ Compiler::~Compiler()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void Compiler::compile(Node const& node, Program& program)
|
||
|
{
|
||
|
switch (node.type())
|
||
|
{
|
||
|
case NODE_MODULE: {
|
||
|
for (size_t i=0; i<node.size(); i++)
|
||
|
{
|
||
|
compile(*node.child_at(i), program);
|
||
|
program.append(OPCODE_POP);
|
||
|
}
|
||
|
} break;
|
||
|
|
||
|
case NODE_INT: {
|
||
|
size_t addr = program
|
||
|
.add_constant(std::make_shared<Constant>
|
||
|
(TYPE_INT, std::stoi(node.repr())));
|
||
|
program.append(OPCODE_LOAD_CONST, addr);
|
||
|
} break;
|
||
|
|
||
|
default: {
|
||
|
std::cerr << "cannot compile node '"
|
||
|
<< node.string() << "'" << std::endl;
|
||
|
abort();
|
||
|
} break;
|
||
|
}
|
||
|
}
|
||
|
}
|