feat: 类型别名 type alias (P1 #10)

- lexer: TOK_TYPE 关键字
- ast: AST_TYPE_ALIAS + AST_PROGRAM aliases数组
- parser: parse_type_expr() 抽取, type Name = Type; 解析
- sema: 别名注册+解析, 类型标注/struct字段/函数参数均支持
- 新增测试: 15_type_alias.l, 16_type_alias_struct.l

测试: 112 通过 (41+15+41+15)
This commit is contained in:
2026-06-05 13:54:58 +08:00
parent da9a7065dd
commit ab88ea2753
13 changed files with 235 additions and 79 deletions
+13 -1
View File
@@ -9,12 +9,15 @@
n->loc = loc
AstNode* ast_make_program(void* alloc, AstNode** fns, size_t fn_count,
AstNode** structs, size_t struct_count, SourceLoc loc) {
AstNode** structs, size_t struct_count,
AstNode** aliases, size_t alias_count, SourceLoc loc) {
NEW(alloc, AST_PROGRAM);
n->as.program.functions = fns;
n->as.program.fn_count = fn_count;
n->as.program.structs = structs;
n->as.program.struct_count = struct_count;
n->as.program.type_aliases = aliases;
n->as.program.alias_count = alias_count;
return n;
}
@@ -165,3 +168,12 @@ AstNode* ast_make_field_access(void* alloc, AstNode* object, const char* field,
n->as.field_access.field_index = -1;
return n;
}
AstNode* ast_make_type_alias(void* alloc, const char* name, TypeKind aliased,
const char* aliased_struct, SourceLoc loc) {
NEW(alloc, AST_TYPE_ALIAS);
n->as.type_alias.name = name;
n->as.type_alias.aliased_type = aliased;
n->as.type_alias.aliased_struct_name = aliased_struct;
return n;
}