diff --git a/CLAUDE.md b/CLAUDE.md index d16543c..d491699 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,7 +2,7 @@ ## 项目概述 -L Language v0.6 — 用 C17 实现的静态类型编译型编程语言,Rust 风格语法,LLVM 22.x 后端。经典 5 阶段流水线:词法 → 语法 → 语义 → IR → 可执行文件。197 单元测试 + 36 集成程序。 +L Language v0.7 — 用 C17 实现的静态类型编译型编程语言,Rust 风格语法,LLVM 22.x 后端。经典 5 阶段流水线:词法 → 语法(+去糖)→ 语义 → IR → 可执行文件。197 单元测试 + 37 集成程序。 ## 语言设计哲学 @@ -135,23 +135,29 @@ L Language/ │ │ └── lexer.h/c 手写状态机,72 种 Token 类型 │ ├── parser/ │ │ ├── parse_internal.h 共享 Parser struct + 内联辅助 -│ │ ├── parser.h/c 语句/声明/程序入口 (564 行) -│ │ ├── expr.c 表达式/类型解析 (484 行, Pratt 主循环) -│ │ └── desugar.h/c 独立去糖 pass (109 行, match/guard/for/if-let/复合赋值) +│ │ ├── parser.h/c 语句/声明/程序入口 (603 行) +│ │ ├── expr.c 表达式/类型解析 (485 行, Pratt 主循环) +│ │ ├── desugar.h/c 独立去糖 pass (109 行, 5 种去糖) +│ │ └── (parser.h) 公开接口 │ ├── ast/ -│ │ └── ast.h/c 27 种 AST 节点 + 工厂函数 +│ │ ├── ast.h/c 27 种 AST 节点 + 工厂函数 +│ │ ├── visit.h/c Visitor 统一 dispatch 框架 +│ │ └── (ast.h) 公开接口 │ ├── sema/ │ │ ├── sema_internal.h 共享声明 + 向前声明 │ │ ├── symbol.h/c 作用域链 (Scope* parent 链表) -│ │ ├── sema.h/c 语义分析入口 + analyze_node (499 行) -│ │ └── typeck.c 表达式类型检查 + 泛型单态化 (629 行) +│ │ ├── sema.h/c 语义分析入口 + analyze_node (500 行) +│ │ ├── typeck.c 表达式类型检查 (559 行, Visitor dispatch) +│ │ ├── mono.c 泛型单态化 (97 行, AST 类型替换) +│ │ └── type_table.h/c 数据驱动类型描述表 (14 种) │ ├── codegen/ │ │ ├── codegen_internal.h 共享 CgCtx + 表操作声明 -│ │ ├── codegen.h/c 语句生成 + 模块入口 (453 行) -│ │ └── cg_expr.c LLVM 表达式生成 + 类型映射 (440 行) +│ │ ├── codegen.h/c 语句生成 + 模块入口 (454 行) +│ │ ├── cg_expr.c LLVM 表达式生成 (426 行, Visitor dispatch) +│ │ └── target.h/c 目标平台输出 (obj 文件) │ ├── driver/ │ │ ├── main.c 入口 + 命令行解析 + 流水线串联 -│ │ └── error.h/c ErrorInfo / ErrorList 错误报告 +│ │ └── error.h/c ErrorInfo / ErrorList (arena 分配) │ └── util/ │ └── arena.h/c Bump allocator (8MB, 8 字节对齐) ├── test/ @@ -160,7 +166,7 @@ L Language/ │ ├── test_parser.c 语法测试 (54 tests, 20 functions) │ ├── test_sema.c 语义测试 (74 tests, 24 functions) │ ├── test_codegen.c 代码生成测试 (28 tests, 10 functions) -│ └── programs/ .l 集成测试 (36 个程序) +│ └── programs/ .l 集成测试 (37 个程序) ├── docs/ │ ├── PRD.md 产品需求文档 │ └── superpowers/plans/ 实现计划 @@ -211,12 +217,21 @@ LLVMModuleRef codegen_module(AstNode* ast, const char* module_name, ## 类型系统 -| L 类型 | LLVM 类型 | C 常量创建 | -|--------|-----------|-----------| -| `i64` | `LLVMInt64Type()` | `LLVMConstInt(ty, val, true)` | -| `f64` | `LLVMDoubleType()` | `LLVMConstReal(ty, val)` | -| `bool` | `LLVMInt1Type()` | `LLVMConstInt(ty, val, false)` | -| `void` | `LLVMVoidType()` | — | +| L 类型 | LLVM 类型 | 说明 | +|--------|-----------|------| +| `i32` | `LLVMInt32Type()` | 有符号 32-bit | +| `i64` | `LLVMInt64Type()` | 有符号 64-bit (默认整数) | +| `u64` | `LLVMInt64Type()` | 无符号 64-bit | +| `f64` | `LLVMDoubleType()` | 双精度浮点 | +| `bool` | `LLVMInt1Type()` | 布尔 | +| `char` | `LLVMInt8Type()` | 字符 | +| `str` | `i8*` (指针) | 字符串,拼接用 malloc+memcpy | +| `void` | `LLVMVoidType()` | 无返回值 | +| `struct` | `LLVMStructType()` | 结构体,字段 GEP | +| `enum` | `{i64, i64}` | tagged union | +| `array` | `LLVMArrayType()` | 固定大小 `T[N]`,GEP 索引 | + +类型表统一管理在 `type_table.c`(promote/convert/numeric 查表驱动)。 类型推断规则: - 字面量:`42` → `i64`, `3.14` → `f64`, `true` → `bool` @@ -270,19 +285,32 @@ done - **C17 标准**:`-Wall -Wextra -g`,零编译警告 - **Arena 分配**:Token、AST、符号表全部从 arena 分配,无 malloc/free 散落 - **LLVM 路径**:`D:\settings\Language\LLVM`,C API 头文件手动补充(v22.1.7 预编译包缺少部分头文件) -- **链接器**:MinGW 环境用 **gcc** 链接(非 clang,避免 MSVC 依赖) +- **链接器**:自包含 clang+lld(优先),gcc fallback。CreateProcess 替代 system() - **Windows**:仅支持 Windows 11 + MinGW-w64 - **错误消息**:中文,格式 `文件名:行号:列号: 描述` -## 已知限制 (v0.5) +## 已知限制 (v0.7) -- 无泛型 (单态化) -- 无 trait / 接口 -- 无模块系统(所有代码单文件) -- 无指针/引用类型 -- 借用检查 (远期) +- 无指针/引用类型(`&T`, `*T`) +- 无借用检查(远期) - 嵌套数组支持有限 -- `match` 仅语句级(非表达式) +- 无闭包 / lambda +- 无多返回值(`(T, U)` 元组) +- 无标准库 +- 仅单文件+mod 模块,无包管理器 +- Windows 独占(LLVM 22 + MinGW-w64) + +### 近期已解决 (v0.5→v0.7) + +- ✅ 泛型单态化 (`fn id(x: T) -> T`) +- ✅ trait / 接口 (`trait Show` + `extend Trait Struct`) +- ✅ 模块系统 (`mod` + `use` + `pub`) +- ✅ ADT 枚举关联数据 (`enum Option { Some(T), None }`) +- ✅ `if let` 模式匹配语法糖 +- ✅ 表达式作为值 (`if-expr`, block 最后表达式) +- ✅ 独立 desugar pass (match/guard/for/if-let/复合赋值) +- ✅ TypeTable 数据驱动 + AST Visitor dispatch +- ✅ 全部源文件 <800 行,197 单元 + 37 集成测试 ## 版本号升级清单