# AGENTS.md 本文件为 L Language 项目的 Codex 上下文文件,定义项目架构、构建命令、核心 API 和开发约定。 ## 项目概述 L Language v0.5 — C17 实现的静态类型编译型语言,Rust 风格语法,LLVM 22.x 后端。5 阶段流水线:词法 → 语法 → 语义 → IR → 可执行文件。38 单元测试 + 23 集成程序。 ## 目录结构 ``` ├── include/l_lang.h TypeKind(10), SourceLoc 公共头文件 ├── src/ │ ├── lexer/ {token,lexer} 手写状态机, 50 Token 类型 │ ├── parser/ parser.c 递归下降 + Pratt, 825 行 │ ├── ast/ ast.{c,h} 25 种 AST 节点 + 工厂函数 │ ├── sema/ {symbol,sema} 作用域链 + 类型推断 + impl mangle │ ├── codegen/{codegen,target} LLVM-C API → 目标代码, 824 行 │ ├── driver/ {main,error} 入口 + 命令行解析 + 错误报告 │ └── util/ arena.c Bump allocator (8MB) ├── test/ │ ├── test_{lexer,parser,sema,codegen}.c 单元测试 (38) │ └── programs/*.l 集成测试 (23) └── docs/ ├── PRD.md 产品需求文档 (v0.1) ├── analysis/ 架构分析报告 └── architecture-improvements.md ``` ## 构建命令 ```powershell cd build cmake .. -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH="D:/settings/Language/LLVM" mingw32-make -j4 mingw32-make l_lang # 仅编译器 ``` ## 编译流水线 ``` 源码(.l) → Lexer → Parser → Sema → Codegen → Target(obj) → GCC 链接(.exe) 50 Tok 25 AST 类型标注 LLVM IR .o 可执行文件 ``` ## 核心 API ```c // lexer.h — 词法分析 Token* lex(Arena* a, const char* source, const char* filename, size_t* count, ErrorInfo* error); // parser.h — 语法分析 AstNode* parse(Arena* a, const Token* tokens, size_t count, const char* filename, ErrorInfo* error); // sema.h — 语义分析 void sema_analyze(AstNode* ast, ErrorList* errors, Arena* arena); // codegen.h — IR 生成 LLVMModuleRef codegen_module(AstNode* ast, const char* module_name, const char** error_msg); ``` ## 类型系统 | L 类型 | LLVM 类型 | TypeKind | |--------|-----------|----------| | i64 | LLVMInt64Type() | TYPE_I64 | | f64 | LLVMDoubleType() | TYPE_F64 | | bool | LLVMInt1Type() | TYPE_BOOL | | str | LLVMInt8PtrType() | TYPE_STR | | void | LLVMVoidType() | TYPE_VOID | | struct | LLVMStructType() | TYPE_STRUCT | | enum | (i64 常量) | TYPE_ENUM | | [T; N] | LLVMArrayType() | TYPE_ARRAY | ## 运算符优先级 (Pratt) | 优先级 | 运算符 | |--------|--------| | 70 (最高) | `-`(一元负) `!` | | 60 | `*` `/` `%` | | 50 | `+` `-` | | 40 | `==` `!=` `<` `>` `<=` `>=` | | 30 | `&&` | | 20 | `\|\|` | ## 关键架构决策 | 决策 | 说明 | |------|------| | impl mangle | sema 将 `impl S { fn f }` 改名为 `S$f`,codegen 零修改 | | match 脱糖 | parser 将 match 转为 let+if-else 链,sema/codegen 完全复用 | | for 脱糖 | for 转为 let mut+while+assign | | 复合赋值脱糖 | `x += 1` → `x = x + 1` | | parse_type_expr 统一 | 所有类型标注经同一函数解析 | | RAII cleanup_list | 作用域级自动 free,dynamic resize | ## 版本状态 | 指标 | v0.5 | |------|------| | 实现代码 | ~3,336 行 | | Token 类型 | 50 | | AST 节点 | 25 | | TypeKind | 10 | | SymbolKind | 5 (VAR/PARAM/FN/STRUCT/ENUM) | | P0 完成度 | 4/4 (100%) | | P1 完成度 | 6/6 (100%) | | 已知技术债务 | 10 项 | ## 开发约定 - **语言标准**: C17,`-Wall -Wextra -g`,零警告 - **内存管理**: Token/AST/符号表均在 arena 分配,禁止 malloc/free 散落 - **错误消息**: 中文,格式 `文件名:行号:列号: 描述` - **平台**: Windows 11 + MinGW-w64,链接器用 gcc(非 clang) - **LLVM 路径**: `D:\settings\Language\LLVM`(v22.1.7,C API) - **去糖优先**: 复杂语法优先在 parser 层去糖为简单原语,减少 sema/codegen 改动 - **新增功能流程**: lexer token → ast 节点 → parser 解析 → sema 检查 → codegen 生成 → 测试 ## 测试 ```powershell ./l_lang_lexer_test.exe # 3 测试 ./l_lang_test.exe # 5 测试 ./l_lang_sema_test.exe # 21 测试 ./l_lang_codegen_test.exe # 9 测试 # 集成测试 Get-ChildItem test/programs/*.l | ForEach-Object { ./l_lang.exe $_.FullName -o test.exe ./test.exe } ``` ## 当前技术债务 (优先级排序) 1. **高**: analyze_expr 膨胀 (350+ 行),match/sema 无单元测试 2. **中**: parser.c 825 行单文件,codegen.c 824 行单文件,match 脱糖在 parser 非独立 pass,`[Point; N]` 未实现 3. **低**: TypeKind 耦合 (改 7+ 文件),AST Visitor 缺失,CHANGELOG 未更新 v0.4/v0.5,LLVM 22 无 mem2reg C API