Files
l-language/AGENTS.md
T

143 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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} 手写状态机, 67 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 | 作用域级自动 freedynamic resize |
## 版本状态
| 指标 | v0.5 |
|------|------|
| 实现代码 | ~3,336 行 |
| Token 类型 | 67 |
| 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.7C 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.5LLVM 22 无 mem2reg C API