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:
2026-06-05 14:01:47 +08:00
parent ab88ea2753
commit 5237398245
14 changed files with 267 additions and 21 deletions
+24 -1
View File
@@ -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;
}