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:
+12
-2
@@ -24,6 +24,8 @@ typedef enum {
|
||||
AST_STRUCT_INIT, // Point { x: 10, y: 20 }
|
||||
AST_FIELD_ACCESS, // p.x
|
||||
AST_TYPE_ALIAS, // type Meters = i64
|
||||
AST_ENUM_DECL, // enum Color { Red, Green, Blue }
|
||||
AST_ENUM_VARIANT, // Color::Red
|
||||
} AstKind;
|
||||
|
||||
typedef enum {
|
||||
@@ -50,7 +52,8 @@ struct AstNode {
|
||||
// AST_PROGRAM
|
||||
struct { struct AstNode** functions; size_t fn_count;
|
||||
struct AstNode** structs; size_t struct_count;
|
||||
struct AstNode** type_aliases; size_t alias_count; } program;
|
||||
struct AstNode** type_aliases; size_t alias_count;
|
||||
struct AstNode** enums; size_t enum_count; } program;
|
||||
// AST_FUNCTION
|
||||
struct { const char* name; struct AstNode** params; size_t param_count;
|
||||
TypeKind return_type; const char* return_struct_type_name;
|
||||
@@ -91,13 +94,18 @@ struct AstNode {
|
||||
struct { struct AstNode* object; const char* field; int field_index; } field_access;
|
||||
// AST_TYPE_ALIAS
|
||||
struct { const char* name; TypeKind aliased_type; const char* aliased_struct_name; } type_alias;
|
||||
// AST_ENUM_DECL
|
||||
struct { const char* name; const char** variants; size_t variant_count; } enum_decl;
|
||||
// AST_ENUM_VARIANT
|
||||
struct { const char* enum_name; const char* variant_name; int variant_index; } enum_variant;
|
||||
} as;
|
||||
};
|
||||
|
||||
// 创建节点的辅助函数(内存来自 arena,通过 void* 传递避免循环依赖)
|
||||
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);
|
||||
AstNode* ast_make_function(void* alloc, const char* name, AstNode** params, size_t pcount,
|
||||
TypeKind ret, const char* ret_struct_name, AstNode* body, SourceLoc loc);
|
||||
AstNode* ast_make_parameter(void* alloc, const char* name, TypeKind type, const char* struct_type_name, SourceLoc loc);
|
||||
@@ -122,5 +130,7 @@ AstNode* ast_make_struct_init(void* alloc, const char* type_name, const char** f
|
||||
AstNode* ast_make_field_access(void* alloc, AstNode* object, const char* field, SourceLoc loc);
|
||||
AstNode* ast_make_type_alias(void* alloc, const char* name, TypeKind aliased,
|
||||
const char* aliased_struct, SourceLoc loc);
|
||||
AstNode* ast_make_enum_decl(void* alloc, const char* name, const char** variants, size_t count, SourceLoc loc);
|
||||
AstNode* ast_make_enum_variant(void* alloc, const char* enum_name, const char* variant_name, SourceLoc loc);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user