stage1 重构语义分析 ast2ir ir部分

This commit is contained in:
zzy
2026-08-18 11:22:15 +08:00
parent 4d9509c167
commit 994a35a942
7 changed files with 970 additions and 3659 deletions

View File

@@ -43,15 +43,14 @@ bool spl_scope_find(spl_scope_t *scope, const char *name, spl_symbol_t *out) {
if (scope == NULL || name == NULL || out == NULL) {
return false;
}
spl_symbol_t symbol = {0};
for (spl_scope_node_t *s = &vec_at(scope->scopes, scope->current_scope); s->parent != 0;
for (spl_scope_node_t *s = &vec_at(scope->scopes, scope->current_scope); s != 0;
s = &vec_at(scope->scopes, s->parent)) {
if (map_get(s->symbols, name, &symbol) == true) {
Assert(symbol.kind != SPL_SYMBOL_KIND_ERROR);
if (map_get(s->symbols, name, out) == true) {
Assert(out->kind != SPL_SYMBOL_KIND_ERROR);
break;
}
}
if (symbol.kind == SPL_SYMBOL_KIND_ERROR) {
if (out->kind == SPL_SYMBOL_KIND_ERROR) {
return false;
}
return true;
@@ -153,23 +152,71 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
// Parse twice
static void sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
Assert(sema != NULL && ref != 0);
if (ref == 0)
return;
Assert(sema != NULL);
spl_ast_node_t *n = spl_ast_node(sema->ast, ref);
spl_symbol_t symbol = {0};
spl_def_id_t def = 0;
Assert(n != NULL);
switch (n->kind) {
case SPL_AST_NONE:
case SPL_AST_CONTAINER_MEMBERS:
UNREACHABLE();
break;
case SPL_AST_CONTAINER_MEMBERS: {
vec_for(n->container_members, i) { sema_parse(sema, vec_at(n->container_members, i)); }
} break;
case SPL_AST_FN_DECL:
case SPL_AST_FN_DEFINE:
case SPL_AST_FN_DEFINE: {
if (n->resolved_def_id == 0) {
Panic("fn `%s` don't collect", n->fn_decl.name);
}
spl_def_node_t *def = spl_type_def(sema->type, n->resolved_def_id);
def->kind = SPL_DEF_FN_PARAMS;
vec_init(def->fn_params_def);
spl_scope_id_t scope_id = spl_scope_alloc(sema->scope);
spl_scope_id_t old_id = sema->scope->current_scope;
sema->scope->current_scope = scope_id;
vec_for(n->fn_decl.param_list, i) {
spl_ast_node_ref_t ref = vec_at(n->fn_decl.param_list, i);
// sema_parse(sema, ref);
spl_ast_node_t *node = spl_ast_node(sema->ast, ref);
Assert(node->kind = SPL_AST_PARAM_DECL);
spl_var_def_t var_def = {0};
var_def.name = node->param_decl.name;
var_def.scope_id = sema->scope->current_scope;
vec_push(def->fn_params_def, var_def);
}
vec_for(n->fn_decl.block, i) { sema_parse(sema, vec_at(n->fn_decl.block, i)); }
sema->scope->current_scope = old_id;
} break;
case SPL_AST_TYPE_DECL:
case SPL_AST_VAR_DECL:
TODO();
break;
case SPL_AST_VAR_DECL: {
if (n->resolved_def_id == 0) {
symbol.name = n->var_const_decl.name;
symbol.kind = SPL_SYMBOL_KIND_VAR;
symbol.node = spl_type_def_alloc(sema->type);
n->resolved_def_id = symbol.node;
spl_def_node_t *def = spl_type_def(sema->type, symbol.node);
def->kind = SPL_DEF_VAR;
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
}
spl_def_node_t *def_node = spl_type_def(sema->type, n->resolved_def_id);
} break;
case SPL_AST_CONST_DECL:
case SPL_AST_MEMBER_DECL:
TODO();
break;
case SPL_AST__COMPTIME_STMT:
case SPL_AST__DIRECTIVE_BLOCK:
case SPL_AST_PARAM_DECL:
break;
case SPL_AST_ATTR_ITEM:
case SPL_AST_ARGG_INIT_ITEM:
case SPL_AST_IF_STATEMENT:
@@ -178,7 +225,11 @@ static void sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
case SPL_AST_LOOP_STATEMENT:
case SPL_AST_FOR_STATEMENT:
case SPL_AST_MATCH_STATEMENT:
case SPL_AST_RET_STATEMENT:
TODO();
break;
case SPL_AST_RET_STATEMENT: {
sema_parse(sema, n->ret_statement.expr);
} break;
case SPL_AST_BREAK_STATEMENT:
case SPL_AST_CONTINUE_STATEMENT:
case SPL_AST_DEFER_STATEMENT:
@@ -227,6 +278,8 @@ static void sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
case SPL_AST_INDEX_EXPR:
case SPL_AST_SLICE_EXPR:
case SPL_AST_AS_EXPR:
TODO();
break;
case SPL_AST_EXPR_INTEGER_LIT:
case SPL_AST_EXPR_FLOAT_LIT:
case SPL_AST_EXPR_CHAR_LIT:
@@ -235,7 +288,15 @@ static void sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
case SPL_AST_EXPR_FALSE:
case SPL_AST_EXPR_NULL:
case SPL_AST_EXPR_UNDEFINED:
case SPL_AST_EXPR_IDENT:
break;
case SPL_AST_EXPR_IDENT: {
if (!spl_scope_find(sema->scope, n->primary_expr.ident, &symbol)) {
LOG_FATAL("can't find ident `%s`", n->primary_expr.ident);
return;
}
Assert(symbol.node != 0);
n->resolved_def_id = symbol.node;
} break;
case SPL_AST_ARGGREGATE_INIT:
case SPL_AST_EXPR_EXPR:
case SPL_AST_ARRAY_LIT:
@@ -243,6 +304,8 @@ static void sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
case SPL_AST_BLOCK_EXPR:
case SPL_AST_BASE_TYPE_FN:
case SPL_AST_BASE_TYPE_PATH:
TODO();
break;
case SPL_AST_TYPE_POINTER:
case SPL_AST_TYPE_ARRAY:
case SPL_AST_TYPE_SLICE:
@@ -267,6 +330,7 @@ static void sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
case SPL_AST_TYPE__F64:
case SPL_AST_TYPE_ANY:
case SPL_AST_TYPE_IDENT:
TODO();
break;
case SPL_AST_COUNT:
UNREACHABLE();