stage1 修复设计问题 实现ast2ir
This commit is contained in:
@@ -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(聚合/别名/内置为 0;ast2ir 据此直接取类型) */
|
||||
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 引用 → 其符号 def(var 用 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 realloc,t 会失效,须每次刷新 */
|
||||
@@ -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) */
|
||||
|
||||
Reference in New Issue
Block a user