#include "compiler.h" #include "lib/commons.h" void compiler_init(compiler_t* compiler, mod_t* mod, tysy_t* tysy, err_t* err) { assert(compiler); assert(err); compiler->mod = mod; compiler->tysy = tysy; compiler->err = err; } void compiler_free(compiler_t* compiler) { assert(compiler); } void compiler_run(compiler_t* compiler, node_t* node) { assert(compiler); assert(node); switch (node->type) { case NODE_MOD: { for (size_t i=0; ichildren.size; i++) { compiler_run(compiler, (node_t*) node->children.data[i]); } } break; case NODE_NUM: { double value = atof(node->value.data); value_t* val = tysy_new_num(compiler->tysy, value); Opcode op = OP_PUSH; param_t param = (param_t) mod_push_new_value(compiler->mod, val); mod_push_instr(compiler->mod, op, param); } break; case NODE_BOOL: { int value = strcmp(node->value.data, "true") == 0; value_t* val = tysy_new_bool(compiler->tysy, value); Opcode op = OP_PUSH; param_t param = (param_t) mod_push_new_value(compiler->mod, val); mod_push_instr(compiler->mod, op, param); } break; case NODE_STR: { char* value = node->value.data; value_t* val = tysy_new_str(compiler->tysy, value); Opcode op = OP_PUSH; param_t param = (param_t) mod_push_new_value(compiler->mod, val); mod_push_instr(compiler->mod, op, param); } break; default: { char msg[RZ_STR_LIMIT]; snprintf(msg, RZ_STR_LIMIT, "Unknown node '%s'", NodeTypeStr[node->type]); err_error(compiler->err, msg, node->line); } break; } }