feat: 枚举 enum (P1 #7)
- lexer: TOK_ENUM, TOK_COLON_COLON
- ast: AST_ENUM_DECL, AST_ENUM_VARIANT + AST_PROGRAM enums数组
- parser: enum Name { A, B } + Enum::Variant语法
- sema: SYM_ENUM, 变体验证, enum→i64类型兼容
- codegen: TYPE_ENUM→i64, 变体→ConstInt(索引值)
- 新增集成测试: 17_enum.l
测试: 121 通过 (41+15+47+18)
This commit is contained in:
+24
-1
@@ -10,7 +10,8 @@
|
||||
|
||||
AstNode* ast_make_program(void* alloc, AstNode** fns, size_t fn_count,
|
||||
AstNode** structs, size_t struct_count,
|
||||
AstNode** aliases, size_t alias_count, SourceLoc loc) {
|
||||
AstNode** aliases, size_t alias_count,
|
||||
AstNode** enums, size_t enum_count, SourceLoc loc) {
|
||||
NEW(alloc, AST_PROGRAM);
|
||||
n->as.program.functions = fns;
|
||||
n->as.program.fn_count = fn_count;
|
||||
@@ -18,6 +19,8 @@ AstNode* ast_make_program(void* alloc, AstNode** fns, size_t fn_count,
|
||||
n->as.program.struct_count = struct_count;
|
||||
n->as.program.type_aliases = aliases;
|
||||
n->as.program.alias_count = alias_count;
|
||||
n->as.program.enums = enums;
|
||||
n->as.program.enum_count = enum_count;
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -177,3 +180,23 @@ AstNode* ast_make_type_alias(void* alloc, const char* name, TypeKind aliased,
|
||||
n->as.type_alias.aliased_struct_name = aliased_struct;
|
||||
return n;
|
||||
}
|
||||
|
||||
// === 枚举相关工厂函数 ===
|
||||
|
||||
AstNode* ast_make_enum_decl(void* alloc, const char* name, const char** variants,
|
||||
size_t count, SourceLoc loc) {
|
||||
NEW(alloc, AST_ENUM_DECL);
|
||||
n->as.enum_decl.name = name;
|
||||
n->as.enum_decl.variants = variants;
|
||||
n->as.enum_decl.variant_count = count;
|
||||
return n;
|
||||
}
|
||||
|
||||
AstNode* ast_make_enum_variant(void* alloc, const char* enum_name,
|
||||
const char* variant_name, SourceLoc loc) {
|
||||
NEW(alloc, AST_ENUM_VARIANT);
|
||||
n->as.enum_variant.enum_name = enum_name;
|
||||
n->as.enum_variant.variant_name = variant_name;
|
||||
n->as.enum_variant.variant_index = -1;
|
||||
return n;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user