feat: finish generator
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
#include <compiler/internals/gen.h>
|
||||
|
||||
// Identifier lookup
|
||||
gen_res_t gen_identifier(fzl_gen_t *gen, fzl_node_t *node)
|
||||
{
|
||||
if (!gen || !node)
|
||||
return gen_error;
|
||||
|
||||
fzl_sym_t sym;
|
||||
bool exists = false;
|
||||
ssize_t i = gen->syms_top - 1;
|
||||
for (; i >= 0; i--)
|
||||
if ((exists = fzl_symt_get(gen->syms[i], node->token->value, &sym)))
|
||||
break;
|
||||
|
||||
if (!exists)
|
||||
return gen_error;
|
||||
|
||||
if (!sym.slot_set)
|
||||
return gen_error;
|
||||
|
||||
size_t depth = gen->syms_top - 1 - i;
|
||||
gen_op(gen, FZL_OPCODE_LOAD_LOCAL);
|
||||
gen_word(gen, depth);
|
||||
gen_word(gen, sym.slot);
|
||||
|
||||
return (gen_res_t){
|
||||
.error = false, .type = sym.type, .classname = sym.classname};
|
||||
}
|
||||
Reference in New Issue
Block a user