roza/lib/prepass.c

69 lines
1.4 KiB
C
Raw Normal View History

2023-12-11 17:01:22 +00:00
#include "prepass.h"
#include "lib/sym.h"
#include "node.h"
2023-12-11 17:01:22 +00:00
void prepass_init(prepass_t* prepass,
sym_t* sym,
tysolver_t* tysolver,
err_t* err)
2023-12-11 17:01:22 +00:00
{
assert(prepass);
assert(sym);
assert(tysolver);
2023-12-11 17:01:22 +00:00
assert(err);
prepass->sym = sym;
prepass->tysolver = tysolver;
2023-12-11 17:01:22 +00:00
prepass->err = err;
prepass->scope = 0;
2023-12-11 17:01:22 +00:00
}
void prepass_free(prepass_t* prepass)
{
assert(prepass);
}
void prepass_run(prepass_t* prepass, node_t* node)
{
assert(prepass);
assert(node);
switch (node->type)
{
case NODE_BLOCK: {
prepass->scope++;
for (size_t i=0; i<node->children.size; i++)
{
node_t* child = (node_t*) node->children.data[i];
prepass_run(prepass, child);
}
prepass->scope--;
} break;
case NODE_VARDECL: {
char* name = ((node_t*) node->children.data[0])->value.data;
node_t* block = node_try_find_parent(node, NODE_BLOCK);
prepass_run(prepass, (node_t*) node->children.data[1]);
2023-12-15 21:31:01 +00:00
type_t* type = tysolver_try_solve_node(prepass->tysolver,
(node_t*) node->children.data[1]);
sym_declare(prepass->sym, name, type,
prepass->scope, SYM_PRE,
block);
} break;
2023-12-16 18:12:20 +00:00
default: {
2023-12-11 17:01:22 +00:00
for (size_t i=0; i<node->children.size; i++)
{
prepass_run(prepass, (node_t*) node->children.data[i]);
}
} break;
}
}