stage1 修复设计问题 实现ast2ir

This commit is contained in:
zzy
2026-08-05 08:14:23 +08:00
parent 8ac59dfaa1
commit 2ccee5f1cf
14 changed files with 3694 additions and 91 deletions

View File

@@ -112,11 +112,11 @@ static spl_type_id_t find_type(spl_sema_t *sema, const char *name) {
/* ---- 聚合成员登记def 层 agg_def ---- */
static void agg_add_member(spl_sema_t *sema, spl_def_id_t def, const char *name, spl_type_id_t type,
spl_scope_id_t scope) {
spl_scope_id_t scope, spl_def_id_t member_def) {
spl_def_node_t *d = def_at(sema, def);
if (!d || d->kind != SPL_DEF_AGG)
return;
spl_var_def_t v = {name, 0, type, scope};
spl_var_def_t v = {name, member_def, type, scope};
vec_push(d->agg_def, v);
}
@@ -281,6 +281,9 @@ static spl_type_id_t resolve_type_expr(spl_sema_t *sema, spl_ast_node_ref_t ref)
(atom->type_atom.kind == SPL_AST_TYPE_ANY || atom->type_atom.kind == SPL_AST_TYPE_PTR))
sema_error(sema, ref, "bare `_` type only allowed as pointer target `*_`");
}
/* AST 注解:该 type_expr 解析到的 def聚合/别名/内置为 0ast2ir 据此直接取类型) */
if (base)
n->resolved_def_id = def_for_type(sema, base);
return base;
}
@@ -331,6 +334,7 @@ static agg_handle_t agg_prepare(spl_sema_t *sema, spl_ast_node_ref_t ref) {
spl_def_id_t def = def_alloc(sema, SPL_DEF_AGG);
def_at(sema, def)->type_id = tid;
vec_init(def_at(sema, def)->agg_def);
te->resolved_def_id = def; /* 注解:该 type_expr 解析到的 def */
h.tid = tid;
h.def = def;
return h;
@@ -366,13 +370,20 @@ static void agg_resolve(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_type_id_t
m->member_decl.type_expr ? resolve_type_expr(sema, m->member_decl.type_expr) : 0;
/* resolve_type_expr 可能 alloc 新类型 → 两表 realloc须重新取节点 */
spl_type_node_t *tn = spl_type_node(&sema->type, tid);
/* 每个 MEMBER_DECL 建一个 SPL_DEF_MEMBER def结构字段/枚举变体) */
spl_type_id_t mtype = 0;
if (tn->kind == SPL_TYPE_ENUM) {
vec_push(tn->enum_type.variants, ft ? ft : tid);
agg_add_member(sema, def, m->member_decl.name, ft ? ft : tid, agg_scope);
mtype = ft ? ft : tid; /* 哨兵:无载荷变体 = 枚举自身 tid */
vec_push(tn->enum_type.variants, mtype);
} else {
mtype = ft;
vec_push(tn->agg_field_types, ft);
agg_add_member(sema, def, m->member_decl.name, ft, agg_scope);
}
spl_def_id_t mdef = def_alloc(sema, SPL_DEF_MEMBER);
def_at(sema, mdef)->type_id = mtype;
def_at(sema, mdef)->var_def.name = m->member_decl.name;
agg_add_member(sema, def, m->member_decl.name, mtype, agg_scope, mdef);
m->resolved_def_id = mdef; /* 注解member_decl → 其 SPL_DEF_MEMBER def */
break;
}
case SPL_AST_FN_DECL:
@@ -416,13 +427,19 @@ static spl_type_id_t build_agg(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_sco
/* 变量/常量/绑定节点:建 VAR def不包 SPL_TYPE_ID */
static void register_binding(spl_sema_t *sema, const char *name, spl_ast_node_ref_t type_expr,
spl_scope_id_t scope, spl_def_id_t agg_def) {
spl_scope_id_t scope, spl_def_id_t agg_def,
spl_ast_node_ref_t node_ref) {
spl_type_id_t t = type_expr ? resolve_type_expr(sema, type_expr) : 0;
spl_def_id_t def = new_var_def(sema, name, t, scope);
if (!spl_sema_scope_insert(sema, scope, name, def))
sema_error(sema, 0, "duplicate symbol");
if (agg_def)
agg_add_member(sema, agg_def, name, t, scope);
agg_add_member(sema, agg_def, name, t, scope, def);
if (node_ref) {
spl_ast_node_t *nn = node_at(sema->ast, node_ref);
if (nn)
nn->resolved_def_id = def; /* 注解var/const 声明 → 其 VAR def */
}
}
static void sema_var_decl(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_scope_id_t scope,
@@ -430,7 +447,7 @@ static void sema_var_decl(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_scope_id
spl_ast_node_t *n = node_at(sema->ast, ref);
if (!n)
return;
register_binding(sema, n->var_decl.name, n->var_decl.type_expr, scope, agg_def);
register_binding(sema, n->var_decl.name, n->var_decl.type_expr, scope, agg_def, ref);
}
static void sema_const_decl(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_scope_id_t scope,
@@ -438,7 +455,7 @@ static void sema_const_decl(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_scope_
spl_ast_node_t *n = node_at(sema->ast, ref);
if (!n)
return;
register_binding(sema, n->const_decl.name, n->const_decl.type_expr, scope, agg_def);
register_binding(sema, n->const_decl.name, n->const_decl.type_expr, scope, agg_def, ref);
}
/* fn 声明:建 fn type + FN_PARAMS def + 登记名字。不建 fn_scope由 check 新建)。
@@ -477,7 +494,8 @@ static void sema_fn_decl(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_scope_id_
if (!spl_sema_scope_insert(sema, scope, n->fn_decl.name, fdef))
sema_error(sema, ref, "duplicate function name");
if (agg_def)
agg_add_member(sema, agg_def, n->fn_decl.name, fid, scope);
agg_add_member(sema, agg_def, n->fn_decl.name, fid, scope, fdef);
n->resolved_def_id = fdef; /* 注解fn 声明 → 其 FN_PARAMS def */
}
static void sema_type_decl(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_scope_id_t scope,
@@ -510,10 +528,11 @@ static void sema_type_decl(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_scope_i
if (!spl_sema_scope_insert(sema, scope, n->type_decl.name, def))
sema_error(sema, ref, "duplicate type name");
if (agg_def)
agg_add_member(sema, agg_def, n->type_decl.name, tid, scope);
agg_add_member(sema, agg_def, n->type_decl.name, tid, scope, def);
/* 嵌套类型提升到文件作用域:兄弟聚合可裸名引用(如 Lexer 方法内 Tag.eof */
if (agg_def)
spl_sema_scope_insert(sema, sema->root_scope, n->type_decl.name, def);
n->resolved_def_id = def; /* 注解type_decl → 其 AGG/ALIAS def */
}
/* ================================================================
@@ -937,14 +956,32 @@ static spl_type_id_t infer_array_lit(spl_sema_t *sema, spl_ast_node_ref_t ref, s
/* 标识符scope 查找def → 类型) */
static spl_type_id_t infer_ident(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_ast_node_t *n) {
spl_ast_node_t *pn = n->kind == SPL_AST_EXPR ? node_at(sema->ast, n->expr.op_expr.left) : n;
spl_type_id_t t = find_type(sema, pn->primary_expr.ident);
spl_def_id_t def = find_bare(sema, pn->primary_expr.ident);
spl_type_id_t t = def_type(sema, def);
if (!t) {
sema_error(sema, ref, "undefined identifier");
return 0;
}
/* 注解IDENT 引用 → 其符号 defvar 用 VAR、fn 用 FN_PARAMS 等) */
pn->resolved_def_id = def;
return t;
}
/* 表达式 ref 解析到的 def取内层节点注解裸 ident 兜底 find_bare */
static spl_def_id_t expr_def_at(spl_sema_t *sema, spl_ast_node_ref_t ref) {
spl_ast_node_t *n = node_at(sema->ast, ref);
if (!n || n->kind != SPL_AST_EXPR)
return 0;
spl_ast_node_t *inner = node_at(sema->ast, n->expr.op_expr.left);
if (!inner)
return 0;
if (inner->resolved_def_id)
return inner->resolved_def_id;
if (n->expr.op == SPL_AST_PRIMARY_EXPR && inner->primary_expr.kind == SPL_AST_IDENT)
return find_bare(sema, inner->primary_expr.ident);
return 0;
}
static spl_type_id_t infer_postfix(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_ast_node_t *n);
static spl_type_id_t infer_prefix(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_ast_node_t *n);
static void check_stmt(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_sema_ctx_t ctx);
@@ -1080,6 +1117,8 @@ static spl_type_id_t infer_postfix(spl_sema_t *sema, spl_ast_node_ref_t ref, spl
/* 指针自动解引用一层 */
if (t && t->kind == SPL_TYPE_PTR)
base = underlying(sema, t->ptr_pointee);
/* 注解FIELD 节点 → 被访问聚合(自动解引用后)的 AGG def非聚合为 0 */
pf->resolved_def_id = def_for_type(sema, base);
t = type_node(sema, base);
if (!t) {
sema_error(sema, ref, "field access on non-aggregate");
@@ -1171,6 +1210,8 @@ static spl_type_id_t infer_postfix(spl_sema_t *sema, spl_ast_node_ref_t ref, spl
sema_error(sema, ref, "call requires function type");
return 0;
}
/* 注解CALL 节点 → 被调 fn 的 def从 callee primary 节点/裸名解析) */
pf->resolved_def_id = expr_def_at(sema, pf->postfix_expr.primary_expr);
spl_ast_node_ref_vec_t *args = &pf->postfix_expr.call_expr;
/* 变参 fn如 vm_printf最后一个形参 name=NULL 且类型可为 0 */
/* 注意infer_expr 可能新分配类型使 type_table realloct 会失效,须每次刷新 */
@@ -1623,11 +1664,13 @@ static void check_block(spl_sema_t *sema, spl_ast_node_ref_vec_t *block, spl_sco
if (b->block_item.kind == SPL_AST_VARDECL) {
spl_ast_node_t *vd = node_at(sema->ast, b->block_item.var_decl);
if (vd)
register_binding(sema, vd->var_decl.name, vd->var_decl.type_expr, scope, 0);
register_binding(sema, vd->var_decl.name, vd->var_decl.type_expr, scope, 0,
b->block_item.var_decl);
} else if (b->block_item.kind == SPL_AST_CONSTDECL) {
spl_ast_node_t *cd = node_at(sema->ast, b->block_item.const_decl);
if (cd)
register_binding(sema, cd->const_decl.name, cd->const_decl.type_expr, scope, 0);
register_binding(sema, cd->const_decl.name, cd->const_decl.type_expr, scope, 0,
b->block_item.const_decl);
} else if (b->block_item.kind == SPL_AST_TYPEDECL) {
spl_ast_node_t *td = node_at(sema->ast, b->block_item.type_decl);
if (td)
@@ -1664,6 +1707,10 @@ static void check_fn_body(spl_sema_t *sema, spl_ast_node_ref_t ref, spl_def_id_t
if (pv->name) {
spl_def_id_t pdef = new_var_def(sema, pv->name, pv->type_id, fn_scope);
spl_sema_scope_insert(sema, fn_scope, pv->name, pdef);
/* 注解param_decl → 其在 fn_scope 的 VAR def */
spl_ast_node_t *pd = node_at(sema->ast, n->fn_decl.param_list.data[i]);
if (pd)
pd->resolved_def_id = pdef;
}
}
check_block(sema, &n->fn_decl.block, fn_scope, ctx);
@@ -1745,7 +1792,7 @@ void spl_sema_run(spl_sema_t *sema) {
continue;
if (!spl_sema_scope_insert(sema, sema->root_scope, m->type_decl.name, h.def))
sema_error(sema, mref, "duplicate type name");
agg_add_member(sema, sema->root_def, m->type_decl.name, h.tid, sema->root_scope);
agg_add_member(sema, sema->root_def, m->type_decl.name, h.tid, sema->root_scope, h.def);
} else if (te) {
spl_type_id_t tid = resolve_type_expr(sema, m->type_decl.type_expr);
spl_def_id_t def = def_alloc(sema, SPL_DEF_ALIAS);
@@ -1757,7 +1804,7 @@ void spl_sema_run(spl_sema_t *sema) {
d->type_def.scope_id = sema->root_scope;
if (!spl_sema_scope_insert(sema, sema->root_scope, m->type_decl.name, def))
sema_error(sema, mref, "duplicate type name");
agg_add_member(sema, sema->root_def, m->type_decl.name, tid, sema->root_scope);
agg_add_member(sema, sema->root_def, m->type_decl.name, tid, sema->root_scope, def);
}
}
/* 1b. fn 名(建 fn type + def */