roza/lib/prepass.c

82 lines
1.8 KiB
C
Raw Normal View History

2023-12-11 17:01:22 +00:00
#include "prepass.h"
#include "lib/sym.h"
2023-12-20 19:54:58 +00:00
#include "lib/tysy.h"
#include "node.h"
2023-12-11 17:01:22 +00:00
void prepass_init(prepass_t* prepass,
sym_t* sym,
2023-12-20 19:54:58 +00:00
tysy_t* tysy,
tysolver_t* tysolver,
err_t* err)
2023-12-11 17:01:22 +00:00
{
assert(prepass);
assert(sym);
2023-12-20 19:54:58 +00:00
assert(tysy);
assert(tysolver);
2023-12-11 17:01:22 +00:00
assert(err);
prepass->sym = sym;
2023-12-20 19:54:58 +00:00
prepass->tysy = tysy;
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;
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,
2023-12-20 19:54:58 +00:00
node);
} break;
2023-12-16 18:12:20 +00:00
2023-12-20 19:54:58 +00:00
case NODE_FUNDECL: {
char* name = ((node_t*) node->children.data[0])->value.data;
sym_declare(prepass->sym, name,
tysy_try_find_type(prepass->tysy, "fun"),
prepass->scope,
SYM_PRE,
node);
} break;
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;
}
}