roza/lib/Compiler.cpp

113 lines
2.6 KiB
C++
Raw Normal View History

2023-08-30 18:06:26 +00:00
#include "Compiler.hpp"
#include "lib/opcodes.hpp"
namespace roza
{
/*explicit*/ Compiler::Compiler(StatusLog& log)
: m_log { log }
{
}
/*virtual*/ Compiler::~Compiler()
{
}
std::shared_ptr<Program> Compiler::compile(std::shared_ptr<Node> root)
{
auto program = std::make_shared<Program>();
compile_node(root, program);
return program;
}
void Compiler::compile_node(std::shared_ptr<Node> root, std::shared_ptr<Program> prog)
{
switch (root->type())
{
case NODE_INT: {
auto value = std::make_shared<Value>(std::stoi(root->repr()), root->loc());
prog->push_instr(OP_PUSH_CONST, prog->push_value(value));
} break;
2023-08-31 09:07:03 +00:00
case NODE_BOOL: {
auto value = std::make_shared<Value>(root->repr() == "true", root->loc());
prog->push_instr(OP_PUSH_CONST, prog->push_value(value));
} break;
case NODE_IMP: {
compile_children(root, prog);
prog->push_instr(OP_IMP);
} break;
case NODE_AND: {
compile_children(root, prog);
prog->push_instr(OP_AND);
} break;
case NODE_OR: {
compile_children(root, prog);
prog->push_instr(OP_OR);
} break;
case NODE_NOT: {
compile_children(root, prog);
prog->push_instr(OP_NOT);
} break;
2023-08-30 22:31:19 +00:00
case NODE_ADD: {
compile_children(root, prog);
prog->push_instr(OP_IADD);
} break;
case NODE_SUB: {
compile_children(root, prog);
prog->push_instr(OP_ISUB);
} break;
case NODE_MUL: {
compile_children(root, prog);
prog->push_instr(OP_IMUL);
} break;
case NODE_DIV: {
2023-08-30 18:06:26 +00:00
compile_children(root, prog);
2023-08-30 22:31:19 +00:00
prog->push_instr(OP_IDIV);
2023-08-30 18:06:26 +00:00
} break;
2023-08-30 22:31:19 +00:00
case NODE_MOD: {
compile_children(root, prog);
prog->push_instr(OP_IMOD);
} break;
case NODE_POW: {
compile_children(root, prog);
prog->push_instr(OP_IPOW);
} break;
case NODE_UADD: {
compile_children(root, prog);
prog->push_instr(OP_IUADD);
} break;
case NODE_USUB: {
compile_children(root, prog);
prog->push_instr(OP_IUSUB);
} break;
case NODE_PROG: {
2023-08-30 18:06:26 +00:00
compile_children(root, prog);
} break;
default:
m_log.fatal(root->loc(), "cannot compile node '" + root->string() + "'.");
}
}
void Compiler::compile_children(std::shared_ptr<Node> root, std::shared_ptr<Program> prog)
{
for (size_t i=0; i<root->size(); i++)
{
compile_node(root->child(i), prog);
}
}
}