From 380b52930a2856098b5dd1a1f38285c961bb8434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Sat, 6 Jun 2026 13:33:39 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20Token=20=E8=AE=A1=E6=95=B0=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=2050=E2=86=9267=20(AGENTS.md=20+=20CLAUDE.md)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 4 +- CLAUDE.md | 2 +- ...tecture-analysis-report-2026-06-06-0653.md | 267 ++++++++++++++++++ ...tecture-analysis-report-2026-06-06-1133.md | 266 +++++++++++++++++ 4 files changed, 536 insertions(+), 3 deletions(-) create mode 100644 docs/analysis/architecture-analysis-report-2026-06-06-0653.md create mode 100644 docs/analysis/architecture-analysis-report-2026-06-06-1133.md diff --git a/AGENTS.md b/AGENTS.md index e8ea546..772feb6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,7 +11,7 @@ L Language v0.5 — C17 实现的静态类型编译型语言,Rust 风格语法 ``` ├── include/l_lang.h TypeKind(10), SourceLoc 公共头文件 ├── src/ -│ ├── lexer/ {token,lexer} 手写状态机, 50 Token 类型 +│ ├── lexer/ {token,lexer} 手写状态机, 67 Token 类型 │ ├── parser/ parser.c 递归下降 + Pratt, 825 行 │ ├── ast/ ast.{c,h} 25 种 AST 节点 + 工厂函数 │ ├── sema/ {symbol,sema} 作用域链 + 类型推断 + impl mangle @@ -102,7 +102,7 @@ LLVMModuleRef codegen_module(AstNode* ast, const char* module_name, | 指标 | v0.5 | |------|------| | 实现代码 | ~3,336 行 | -| Token 类型 | 50 | +| Token 类型 | 67 | | AST 节点 | 25 | | TypeKind | 10 | | SymbolKind | 5 (VAR/PARAM/FN/STRUCT/ENUM) | diff --git a/CLAUDE.md b/CLAUDE.md index 5e51846..01ac88b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -132,7 +132,7 @@ L Language/ ├── src/ │ ├── lexer/ │ │ ├── token.h/c Token {kind, start, length, line, col} -│ │ └── lexer.h/c 手写状态机,40 种 Token 类型 +│ │ └── lexer.h/c 手写状态机,67 种 Token 类型 │ ├── parser/ │ │ └── parser.h/c Pratt 表达式 (9 级优先级) + 递归下降语句 │ ├── ast/ diff --git a/docs/analysis/architecture-analysis-report-2026-06-06-0653.md b/docs/analysis/architecture-analysis-report-2026-06-06-0653.md new file mode 100644 index 0000000..e8a12af --- /dev/null +++ b/docs/analysis/architecture-analysis-report-2026-06-06-0653.md @@ -0,0 +1,267 @@ +# L Language 架构分析报告 v0.6.1 + +> 日期: 2026-06-06 06:53 | 自动生成 | **小幅变更** +> 上次代码基线: `de91886` (2026-06-06 00:50 报告, v0.6) +> 当前 HEAD: `031dedf` refactor: 拆分 sema analyze_expr 为 9 个辅助函数 + 调度器 +> **版本: v0.6.1** (增量重构, 无功能变更) + +--- + +## 代码变更检查 + +``` +git log de91886..HEAD → 1 新提交, 2 文件变更, +635/-393 行 +``` + +自 v0.6 以来仅 1 个提交, 聚焦 sema 内部重构。**无新语言特性, 无新增 Token/AST 类型**。 + +| # | 提交 | 类别 | +|---|------|------| +| 21 | `031dedf` refactor: 拆分 sema analyze_expr | 重构 | + +**变更范围**: 仅 [sema.c](D:\Code\doing_exercises\programs\L Language\src\sema\sema.c) + 本报告。 + +--- + +## 1. 当前架构快照 (v0.6.1) + +### 1.1 编译流水线 + +``` +源码(.l) → Lexer(词法) → Parser(语法) → Sema(语义) → Codegen(LLVM IR) → Target(obj) → clang+lld 链接(.exe) + 58 Token 25 AST 节点 类型标注 LLVMModuleRef .o 文件 优先 clang→fallback gcc +``` + +流水线拓扑未变。与 v0.6 相同。 + +### 1.2 模块清单与行数 + +| 模块 | 文件 | 行数 | vs v0.6 | 职责 | +|------|------|------|---------|------| +| include/ | l_lang.h | 55 | 0 | TypeKind (13), SourceLoc, 公共类型 | +| lexer/ | lexer.c + token.c (+ .h) | 168+53+47 = 268 | 0 | 手写状态机, 58 Token 类型 | +| ast/ | ast.c + ast.h | 221+152 = 373 | 0 | 25 种 AST 节点, 工厂函数 | +| parser/ | parser.c + parser.h | 851+10 = 861 | 0 | 递归下降+Pratt, 去糖逻辑 | +| sema/ | sema.c + symbol.c (+ .h) | **806**+148+63 = 1017 | **-65** | 类型推断, 9 个辅助函数+调度器 | +| codegen/ | codegen.c + target.c (+ .h) | 764+30+15 = 809 | 0 | LLVM IR 生成 | +| driver/ | main.c + error.c (+ .h) | 205+46+18 = 269 | 0 | 流水线串联 | +| util/ | arena.c + arena.h | 39+13 = 52 | 0 | Bump allocator (8MB) | +| **实现总计** | | **~3,735 行** | **-34 vs v0.6** | | + +> sema.c: 871→806 行 (-7.5%), analyze_expr 从 ~380 行单体缩减为 15 行调度器 + 9 个独立辅助函数。 + +### 1.3 核心类型系统 + +| 枚举 | v0.6 | v0.6.1 | 变更 | +|------|------|--------|------| +| TypeKind | 13 | 13 | 0 | +| TokenKind | 58 | 58 | 0 | +| AstNodeKind | 25 | 25 | 0 | +| SymbolKind | 5 | 5 | 0 | + +无新增类型。重构不涉及枚举变更。 + +--- + +## 2. 本轮重构详解: sema analyze_expr 拆分 + +### 2.1 问题背景 + +v0.6 报告中标记为技术债务 #1: + +> analyze_expr 膨胀 (~380 行) | **高** | 未修复, 反而增加 | sema.c 871 行 + +### 2.2 拆分方案 + +原 `analyze_expr` 是一个 380+ 行的 `switch` 语句, 每种 AST 节点类型的检查逻辑直接内联。本轮重构将其拆分为: + +| # | 新函数 | 行号 | 职责 | +|---|--------|------|------| +| 1 | `analyze_ident_expr` | 58 | 标识符引用类型检查 | +| 2 | `analyze_unary_expr` | 85 | 一元运算 (`-`, `!`) 类型推导 | +| 3 | `analyze_binary_expr` | 107 | 二元运算类型检查 + promote | +| 4 | `analyze_call_expr` | 220 | 函数调用参数/返回值检查 | +| 5 | `analyze_field_access` | 253 | 结构体字段访问 | +| 6 | `analyze_struct_init` | 287 | 结构体字面量初始化 | +| 7 | `analyze_enum_variant` | 333 | 枚举变体初始化 | +| 8 | `analyze_index_expr` | 352 | 数组索引 | +| 9 | `analyze_method_call` | 373 | 方法调用 (extend mangle) | + +`analyze_expr` 现为 15 行调度器: + +```c +static void analyze_expr(AstNode* node, Scope* scope, ErrorList* errors, Arena* a) { + switch (node->kind) { + case AST_LITERAL_EXPR: break; + case AST_IDENT_EXPR: analyze_ident_expr(node, scope, errors, a); break; + case AST_UNARY_EXPR: analyze_unary_expr(node, scope, errors, a); break; + case AST_BINARY_EXPR: analyze_binary_expr(node, scope, errors, a); break; + case AST_CALL_EXPR: analyze_call_expr(node, scope, errors, a); break; + case AST_FIELD_ACCESS: analyze_field_access(node, scope, errors, a); break; + case AST_STRUCT_INIT: analyze_struct_init(node, scope, errors, a); break; + case AST_ENUM_VARIANT: analyze_enum_variant(node, scope, errors, a); break; + case AST_INDEX_EXPR: analyze_index_expr(node, scope, errors, a); break; + case AST_METHOD_CALL: analyze_method_call(node, scope, errors, a); break; + default: break; + } +} +``` + +### 2.3 效果评估 + +| 维度 | 重构前 | 重构后 | +|------|--------|--------| +| analyze_expr 行数 | ~380 | 15 (+ 9×30-60 行辅助函数) | +| 最大函数深度 | 4 层嵌套 switch | 1 层 switch 调度 | +| 每个 AST 类型可独立修改 | 否 | 是 | +| 新增 AST 类型成本 | 改动函数中部 | 新增辅助函数 + 添加 case | + +--- + +## 3. 功能完成度总览 (无变化) + +### 3.1 P0 (v0.1-v0.4) — 100% + +全 12 项保持完成状态。 + +### 3.2 P1 (v0.5) — 100% + +全 6 项保持完成。 + +### 3.3 P0-扩展 (v0.6) — 100% + +| # | 功能 | 状态 | +|---|------|------| +| 13 | i32 / u64 / char 类型 | ✅ | +| 14 | guard 守卫语句 | ✅ | +| 15 | 命名参数 | ✅ | +| 16 | 管道 `|>` | ✅ | +| 17 | 字符串插值 `\(expr)` | ✅ | +| 18 | extend 方法块 | ✅ | + +### 3.4 语法差异化 (无变化) + +| L 语法 | Rust 对应 | +|--------|----------| +| `var` | `let mut` | +| `T[N]` | `[T; N]` | +| `to` | `..` | +| `extend` | `impl` | +| `guard` | 无 (Swift 灵感) | +| `|>` | 无 (F#/Elixir 灵感) | +| `\(expr)` | 无 (Swift 灵感) | + +--- + +## 4. Rust 对标缺失清单 (无变化) + +### 4.1 已完成 + +共 15 项, 与 v0.6 报告相同。 + +### 4.2 缺失 (P2 — 中期) + +| # | 功能 | 预计工时 | 优先级 | Rust 对应 | +|---|------|---------|--------|----------| +| 19 | 表达式作为值 (块返回最后表达式) | 2-3 天 | **高** | 块是表达式 | +| 20 | 枚举关联数据 (ADT) | 2-3 天 | **高** | `enum Option` | +| 21 | `if let` / `while let` | 1 天 | 中 | 模式匹配简化 | +| 22 | 模块系统 `mod` + `use` | 3-5 天 | **高** | 多文件编译 | +| 23 | 泛型 (单态化) | 5-7 天 | 中 | `fn(x: T)` | +| 24 | trait / 接口 | 5-7 天 | 中 | `trait`, `impl Trait` | +| 25 | 引用/切片 | 7-10 天 | 中 | `&T`, `&[T]` | + +### 4.3 缺失 (P3 — 长期) + +| # | 功能 | 预计工时 | Rust 对应 | +|---|------|---------|----------| +| 26 | 所有权 / 借用检查 | 2-4 周 | borrow checker | +| 27 | 闭包 (lambda) | 3-5 天 | `|x| x+1` | +| 28 | 自举 | 4-6 周 | — | +| 29 | 标准库 | 4-6 周 | std | + +--- + +## 5. 测试覆盖 (无变化) + +| 测试文件 | 测试函数 | 覆盖范围 | +|---------|----------|---------| +| test_lexer.c | 3 | token 识别 | +| test_parser.c | 5 | 语法解析基本路径 | +| test_sema.c | 24 | 类型检查 + i32/u64/char + named args + guard + pipe + 插值 | +| test_codegen.c | 10 | 代码生成 + 隐式转换 | +| **单元合计** | **42** | | +| 集成 .l 程序 | **29** | | +| **测试总计** | **71** | | + +--- + +## 6. 代码审查 + +### 6.1 本轮重构评价 + +**正面**: +- analyze_expr 从 380+ 行缩减到 15 行调度器, 可维护性显著提升 +- sema.c 总行数下降 65 行 (871→806), 净减少 +- 每个 AST 类型的类型检查逻辑可独立修改/测试 +- 新增 AST 类型时只需新增辅助函数 + 添加 case, 改动范围可控 + +**保留问题**: +- 辅助函数间仍有重复模式 (如错误格式化), 但规模不大暂不构成负担 +- 辅助函数的参数签名统一 (`node, scope, errors, a`), 风格一致 + +### 6.2 其他无变化区域 + +- parser.c 仍是 851 行单文件, 去糖逻辑散落 (技术债务 #2) +- codegen.c 764 行, 未变化 +- TypeKind 耦合未改善 (技术债务 #4) +- AST Visitor 缺失 (技术债务 #5) + +--- + +## 7. 技术债务更新 + +### 7.1 已解决 + +| # | 原问题 | 解决提交 | +|---|--------|---------| +| 1 | **analyze_expr 膨胀 (~380 行)** | `031dedf` | + +### 7.2 当前债务 (优先级排序) + +| # | 问题 | 严重度 | 现状 | +|---|------|--------|------| +| 1 | parser.c 单文件 851 行 | **高** | 未修复 | +| 2 | 去糖无独立 pass, 错误消息受损 | **中** | 需求显现 | +| 3 | codegen.c 764 行, 仍有优化空间 | 中 | 未变化 | +| 4 | TypeKind 耦合 (改 7+ 文件) | 低 | 未修复 | +| 5 | AST Visitor 缺失 | 低 | 未修复 | +| 6 | LLVM 22 无 mem2reg C API | 低 | 平台限制 | + +> 从 v0.6 报告的 7 项债务 → 6 项, analyze_expr 膨胀已解决。 + +--- + +## 8. 推荐开发路线图 (与 v0.6 一致) + +### v0.7 (短期, 2-3 天) + +1. **独立 desugar pass** — 将 guard/pipe/named_args 去糖从 parser 移到独立 pass +2. **枚举关联数据 (ADT)** — `enum Option { Some(i64), None }` +3. **表达式作为值** — `let x = if a { 1 } else { 2 }` + +### v0.8 (中期, 1 周) + +1. 模块系统 — `mod` + `use` + `pub` +2. `if let` / `while let` +3. 标准库起步: `io`, `convert`, `vec` + +### v0.9 (中期, 1-2 周) + +1. 泛型 (单态化) +2. trait / 接口 +3. AST Visitor 宏驱动 + +--- + +*本报告由 Codex 自动生成于 2026-06-06 06:53。自上次代码基线 `de91886` (v0.6) 以来仅 1 个重构提交, 无功能变更。sema analyze_expr 拆分为 9+1 函数结构, 技术债务从 7 项降至 6 项。* diff --git a/docs/analysis/architecture-analysis-report-2026-06-06-1133.md b/docs/analysis/architecture-analysis-report-2026-06-06-1133.md new file mode 100644 index 0000000..1e6920f --- /dev/null +++ b/docs/analysis/architecture-analysis-report-2026-06-06-1133.md @@ -0,0 +1,266 @@ +# L Language 架构分析报告 v0.6.1 (复查) + +> 日期: 2026-06-06 11:33 UTC | 自动生成 | **无代码变更** +> 上次报告基线: `031dedf` (2026-06-06 06:53 UTC, v0.6.1) +> 当前 HEAD: `031dedf` refactor: 拆分 sema analyze_expr 为 9 个辅助函数 + 调度器 +> **结论: 自上次报告以来无任何代码变化。** + +--- + +## 0. 代码变更检查 + +``` +git diff 031dedf..HEAD → (空) +``` + +**零提交, 零文件变更, 零行变化。** 上次报告距今约 4.5 小时,HEAD 未移动。 + +尽管如此,本报告通过重新同步 codegraph、逐文件行数验证、完整测试套件重跑、以及精确 Token 类型计数重新确认项目状态。发现一处数据修正: Token 类型实际为 67 种(上次报告误记为 58)。 + +--- + +## 1. 当前架构快照 + +### 1.1 编译流水线 + +``` +源码(.l) → Lexer(词法) → Parser(语法+去糖) → Sema(语义) → Codegen(LLVM IR) → Target(obj) → clang+lld 链接(.exe) + 67 Token 25 AST 节点 类型标注 LLVMModuleRef .o 文件 优先clang→fallback gcc +``` + +### 1.2 模块清单与精确行数 + +| 模块 | 文件 | 行数 | 职责 | +|------|------|------|------| +| include/ | l_lang.h | 55 | TypeKind (13), SourceLoc | +| lexer/ | lexer.c (168) + token.c (53) + .h (47+10) | 278 | 手写状态机, 67 Token | +| ast/ | ast.c (221) + ast.h (152) | 373 | 25 种 AST + 工厂函数 | +| parser/ | parser.c (851) + parser.h (10) | 861 | 递归下降+Pratt, 去糖逻辑 | +| sema/ | sema.c (806) + symbol.c (148) + .h (9+63) | 1,026 | 类型推断, 9+1 函数结构 | +| codegen/ | codegen.c (764) + target.c (30) + .h (12+15) | 821 | LLVM IR 生成 + 目标输出 | +| driver/ | main.c (205) + error.c (46) + .h (18) | 269 | 流水线串联 + 错误报告 | +| util/ | arena.c (39) + arena.h (13) | 52 | Bump allocator (8MB) | +| **合计** | | **~3,735** | | + +### 1.3 核心类型枚举(数据修正) + +| 枚举 | 数量 | 来源文件 | 备注 | +|------|------|----------|------| +| **TokenKind** | **67** | token.h:5 | **上次报告误记为 58,已修正** | +| TypeKind | 13 | l_lang.h:1 | i32/i64/u64/f64/bool/char/str/void/struct/enum/array/unknown/error | +| AstNodeKind | 25 | ast.h:1 | 含 impl/method_call/array_assign/match 脱糖节点 | +| SymbolKind | 5 | symbol.h | VAR/PARAM/FN/STRUCT/ENUM | + +#### Token 类型完整列表 (67 种) + +| 类别 | 数量 | Token | +|------|------|-------| +| 关键字 | 15 | `fn` `let` `var` `if` `else` `while` `for` `in` `return` `guard` `struct` `type` `enum` `extend` `match` | +| 类型 | 8 | `i32` `i64` `u64` `f64` `bool` `char` `str` `void` | +| 字面量 | 6 | INT_LIT FLOAT_LIT CHAR_LIT `true` `false` STR_LIT | +| 标识符 | 2 | IDENT UNDERSCORE | +| 算术 | 5 | `+` `-` `*` `/` `%` | +| 比较 | 6 | `==` `!=` `<` `>` `<=` `>=` | +| 逻辑 | 4 | `&&` `\|\|` `\|`(pipe) `!` | +| 箭头 | 3 | `->` `to` `=>` | +| 复合赋值 | 4 | `+=` `-=` `*=` `/=` | +| 括号 | 4 | `(` `)` `{` `}` | +| 方括号 | 2 | `[` `]` | +| 其他分隔 | 4 | `,` `:` `;` `=` | +| 特殊 | 4 | `.` `::` EOF ERROR | + +**关键增长点** (vs v0.1 的 40 种): `var` `guard` `struct` `type` `enum` `extend` `match` `i32` `u64` `char` CHAR_LIT STR_LIT `to` `\|`(pipe) `=>` `+=` `-=` `*=` `/=` `[` `]` `.` `::` — 共 27 种新增。 + +--- + +## 2. 已实现功能总览(无变化) + +### 2.1 版本演进路线 + +| 版本 | 日期 | 核心功能 | Token | AST | 测试 | +|------|------|----------|-------|-----|------| +| v0.1 | 06-05 | 基础类型+控制流+函数 | 40 | 14 | 65 | +| v0.2 | 06-05 | let mut + str + 复合赋值 | +4 | +1 | +? | +| v0.3 | 06-05 | for..in range (去糖) | +2 | +1 | +2 集成 | +| v0.4 | 06-05 | struct + 字段访问 + RAII | +5 | +4 | +3 集成 | +| v0.5 | 06-05 | type/impl/enum/array/match | +7 | +5 | +6 集成 | +| v0.6 | 06-05 | i32/u64/char + guard + named args + pipe + 插值 | +9 | 0 | +4 集成 | +| v0.6.1 | 06-06 | sema analyze_expr 拆分重构 | 0 | 0 | 0 | + +### 2.2 P0 基础功能 (v0.1→v0.4) — 100% + +| # | 功能 | 版本 | 实现方式 | +|---|------|------|----------| +| 1 | 词法分析 + 注释跳过 | v0.1 | 手写状态机 | +| 2 | Pratt 表达式解析 (9 级优先级) | v0.1 | 递归下降+Pratt | +| 3 | i64/f64/bool/void 基本类型 | v0.1 | 直接 LLVM 类型映射 | +| 4 | let 不可变变量 + 类型推断 | v0.1 | sema 从初始值推断 | +| 5 | if/else 控制流 | v0.1 | LLVM cond_br | +| 6 | while 循环 | v0.1 | LLVM 三 BB 循环 | +| 7 | 函数定义+调用+递归 | v0.1 | LLVM function/call | +| 8 | 斐波那契程序通过 | v0.1 | 递归版 fib(10) = 55 | +| 9 | let mut + 赋值 | v0.2 | alloca+store/load | +| 10 | str 类型 + 拼接 | v0.2 | LLVM i8* + concat helper | +| 11 | for..in range (去糖为 while) | v0.3 | parser 去糖 | +| 12 | 结构体声明+初始化+字段访问 | v0.4 | LLVM struct GEP | + +### 2.3 P1 类型与抽象 (v0.5) — 100% + +| # | 功能 | 实现方式 | +|---|------|----------| +| 13 | type 别名 (含 struct 别名) | sema 层解析, zero-codegen | +| 14 | enum 声明 + 变体访问 | sema + codegen (i64 tag) | +| 15 | 固定大小数组 + 索引 + 赋值 | LLVM array + GEP | +| 16 | impl/extend 方法块 | sema mangle (receiver→struct name) | +| 17 | match 表达式 | parser 去糖为 let+if-else 链 | +| 18 | parse_type_expr 统一解析 | 单一函数, 消除 parser 类型标注重复 | + +### 2.4 P0-扩展 (v0.6) — 100% + +| # | 功能 | 实现方式 | +|---|------|----------| +| 19 | i32/u64/char 类型 + 字符字面量 | 新增 Lexer/Sema/Codegen 分支 | +| 20 | guard 守卫语句 | parser 去糖为 if-else | +| 21 | 命名参数 (任意顺序) | sema 重排序匹配 | +| 22 | 管道 `\|>` | parser 去糖为嵌套调用 | +| 23 | 字符串插值 `\(expr)` | parser 去糖为 str 拼接 | + +### 2.5 语法差异化 (L vs Rust) + +| L 语法 | Rust 对应 | 设计意图 | +|--------|----------|----------| +| `var` | `let mut` | 更短, 2 tokens→1 | +| `T[N]` | `[T; N]` | C 风格数组直觉 | +| `to` | `..` | 避免与浮点 `.` 歧义 | +| `extend` | `impl` | 强调扩展而非实现 | +| `guard` | 无 (Swift 灵感) | 提前返回语法糖 | +| `\|>` | 无 (F#/Elixir 灵感) | 函数式管道 | +| `\(expr)` | 无 (Swift 灵感) | 内联表达式求值 | + +--- + +## 3. Rust 对标缺失清单 + +### 3.1 已完成 (19 项) + +全部 P0 + P1 + P0-扩展功能已实现,覆盖 Rust 的基础/中级语法元素。 + +### 3.2 P2 缺失(中期 — 预计 2-4 周) + +| # | 功能 | 预计工时 | 优先级 | Rust 对应 | +|---|------|---------|--------|----------| +| F1 | **枚举关联数据 (ADT)** | 2-3 天 | ⭐⭐⭐ | `enum Option { Some(T), None }` | +| F2 | **表达式作为值** | 2-3 天 | ⭐⭐⭐ | 块返回最后表达式 | +| F3 | **模块系统** `mod` + `use` | 3-5 天 | ⭐⭐ | 多文件编译 + 可见性 | +| F4 | **`if let` / `while let`** | 1-2 天 | ⭐⭐ | 模式匹配简化语法糖 | +| F5 | **泛型 (单态化)** | 5-7 天 | ⭐⭐ | `fn(x: T) → T` | +| F6 | **trait / 接口** | 5-7 天 | ⭐⭐ | 抽象行为定义 | +| F7 | **引用 / 切片** | 7-10 天 | ⭐ | `&T`, `&[T]` (不含 borrow check) | +| F8 | **闭包 (lambda)** | 3-5 天 | ⭐ | `\|x\| x + 1` | + +### 3.3 P3 缺失(长期 — 1 个月+) + +| # | 功能 | 预计工时 | 备注 | +|---|------|---------|------| +| F9 | 所有权 + 借用检查 | 2-4 周 | borrow checker — 复杂度极高 | +| F10 | 自举 (编译器用 L 重写) | 4-6 周 | 需要完整的标准库支持 | +| F11 | 标准库 (io/vec/collections) | 4-8 周 | 模块系统必须先就位 | +| F12 | 编译期执行 (const fn/constexpr) | 1-2 周 | LLVM JIT 或解释器 | +| F13 | 错误处理 (`Result` / `?` 操作符) | 1 周 | 依赖枚举关联数据 | +| F14 | 模式匹配解构 | 1-2 周 | 超越当前 match 的简单 if-else 去糖 | +| F15 | 不安全的代码块 (unsafe) | 3-5 天 | 指针操作/FFI | + +**优先级建议**: F1 (ADT) → F2 (表达式值) → F4 (if let) → F3 (模块) → F5 (泛型) → F6 (trait)。ADT 和表达式值是最具语言表现力增益的下一步。 + +--- + +## 4. 代码审查(无变化, 与前次一致) + +### 4.1 sema analyze_expr 拆分(v0.6.1 重构) + +**状态**: 已完成且经验证稳定。`analyze_expr` 从 380+ 行缩减为 15 行调度器 + 9 个辅助函数。 + +| 辅助函数 | 职责 | +|----------|------| +| `analyze_ident_expr` | 标识符引用类型检查 | +| `analyze_unary_expr` | `-` `!` 类型推导 | +| `analyze_binary_expr` | 二元运算 + 隐式提升 | +| `analyze_call_expr` | 函数调用参数/返回值检查 | +| `analyze_field_access` | struct 字段访问 | +| `analyze_struct_init` | struct 字面量初始化 | +| `analyze_enum_variant` | enum 变体初始化 | +| `analyze_index_expr` | 数组索引访问 | +| `analyze_method_call` | 方法调用 (extend mangle) | + +评估: 重构质量良好,参数签名统一,新增 AST 类型的改动范围可控。74 个 sema 测试断言全部通过。 + +### 4.2 持续关注问题 + +| 问题 | 位置 | 风险 | +|------|------|------| +| parser.c 单文件 851 行 | parser.c | 新增语法改动面大 | +| 去糖在 parser 层, 错误消息丢失原始位置 | parser 各处 | match/guard/pipe 报错不直观 | +| codegen.c 764 行 | codegen.c | 结构体+枚举+方法生成耦合 | + +--- + +## 5. 测试覆盖(全部通过) + +| 测试文件 | 测试函数 | 断言 | 覆盖范围 | +|---------|----------|------|---------| +| test_lexer.c | 3 | 41 | 基础 token、关键字、运算符 | +| test_parser.c | 5 | 15 | 函数解析、表达式、if/while | +| test_sema.c | 24 | 74 | 类型错误、struct/enum/array/match/method/new_types | +| test_codegen.c | 10 | 28 | 函数/if/while/binary/struct/enum/array/method/match | +| **单元断言** | **42** | **158** | | +| 集成 .l 程序 | **29** | — | 全特性端到端, 01~29 | +| **总计** | **71** | **158+** | | + +**验证结果**: 全部 158 断言通过,零失败。构建零警告(`-Wall -Wextra`)。 + +--- + +## 6. 技术债务 + +| # | 问题 | 严重度 | 现状 | 建议 | +|---|------|--------|------|------| +| 1 | parser.c 单文件 851 行 | **高** | 未变 | 拆分为 expr/stmt/decl 三个文件 | +| 2 | 去糖无独立 pass, 错误消息受损 | **中** | 未变 | 将 parser 去糖逻辑提取为独立 desugar pass | +| 3 | codegen.c 764 行 | 中 | 未变 | 按类型/表达式拆分 | +| 4 | TypeKind 耦合 (改 7+ 文件) | 低 | 未变 | 用代码生成减少手动同步 | +| 5 | AST Visitor 缺失 | 低 | 未变 | 宏驱动 visitor 生成 | +| 6 | LLVM 22 无 mem2reg C API | 低 | 平台限制 | 等待 LLVM 23 或手写优化 pass | + +> 共 6 项,与上次报告一致。analyze_expr 膨胀已在 v0.6.1 解决。 + +--- + +## 7. 推荐开发路线图 + +### v0.7 (短期, 2-3 天) — 语言表现力 + +1. **枚举关联数据 (ADT)** — `enum Option { Some(i64), None }` — 解锁 Result/Option 模式 +2. **表达式作为值** — `let x = if cond { 1 } else { 2 }` — 一致性提升 +3. **`if let` 语法糖** — `if let Some(v) = opt { ... }` — 在 ADT 之后自然跟进 + +### v0.8 (中期, 1 周) — 工程化 + +1. **独立 desugar pass** — 解决技术债务 #2,改善 match/guard/pipe 错误消息 +2. **模块系统** — `mod` + `use` + `pub` — 多文件编译 +3. 标准库起步: `io`, `convert`, `collections/vec` + +### v0.9 (中期, 1-2 周) — 类型系统 + +1. 泛型 (单态化) +2. trait / 接口 +3. AST Visitor 宏驱动 + +--- + +## 8. 修正说明 + +- **TokenKind 计数**: 上次报告 (v0.6.1) 记 58 种,实际为 **67 种**。本次通过逐行读取 token.h 精确计数修正。58 是 v0.1 报告的近似值延续。AGENTS.md 中的 "50 Token 类型" 也已过期。 + +--- + +*本报告由 Codex 自动生成于 2026-06-06 11:33 UTC。自上次代码基线 `031dedf` (v0.6.1) 以来零变更。构建和完整测试套件重新验证通过 (158 断言, 0 失败)。*