3b7bab1e1b
5 阶段编译流水线: 词法分析 → 语法分析(Pratt) → 语义分析(类型推断) → LLVM IR → .exe 模块: - lexer: 手写状态机, 40 种 Token, // 和 /* */ 注释 - parser: Pratt 表达式解析(9 级优先级) + 递归下降语句/函数 - ast: 14 种节点类型 + 工厂函数 - sema: 作用域链符号表 + 类型推断 + 类型检查 - codegen: AST → LLVM-C API, print_i64/f64/bool 内建 - driver: 命令行 + 流水线串联 + 错误报告 - util: Arena bump allocator (8MB) 测试: 65 单元测试(词法41+语法15+语义9) + 5 集成测试 全部通过 语言特性: i64/f64/bool/void, let不可变变量, if/else, while, 递归函数
80 lines
1.8 KiB
Markdown
80 lines
1.8 KiB
Markdown
# 贡献指南
|
|
|
|
## 本地开发环境
|
|
|
|
- **GCC** 14.x+ (MinGW-w64)
|
|
- **CMake** 3.20+
|
|
- **LLVM** 22.x(需要 C API 库和头文件,路径见 CLAUDE.md)
|
|
|
|
## 开发流程
|
|
|
|
1. Fork 本仓库
|
|
2. `git clone <你的 fork>`
|
|
3. `git checkout -b feature/xxx`
|
|
4. 开发 + 测试
|
|
5. `git commit`(遵循约定式提交格式)
|
|
6. `git push`
|
|
7. 提交 Pull Request
|
|
|
|
## 运行测试
|
|
|
|
```bash
|
|
cd build
|
|
|
|
# 单元测试
|
|
./l_lang_lexer_test.exe # 词法分析
|
|
./l_lang_test.exe # 语法分析
|
|
./l_lang_sema_test.exe # 语义分析
|
|
|
|
# 集成测试
|
|
for f in ../test/programs/*.l; do
|
|
./l_lang.exe "$f" -o /tmp/out.exe && /tmp/out.exe
|
|
done
|
|
```
|
|
|
|
## 代码规范
|
|
|
|
### C 代码
|
|
|
|
- C17 标准,`-Wall -Wextra -g` 零警告
|
|
- 注释用中文
|
|
- 内存统一使用 Arena bump allocator,不在局部函数内 malloc/free
|
|
- 错误信息格式:`文件名:行号:列号: 描述`
|
|
- 函数聚焦(< 100 行),文件内聚(< 500 行)
|
|
|
|
### 编译器架构约定
|
|
|
|
- 每个编译阶段独立模块,通过头文件声明公共接口
|
|
- 新增 AST 节点需同步更新 `sema.c` 和 `codegen.c`
|
|
- 新增 Token 类型需同步更新 `lexer.c` 和 `NAMES[]` 数组
|
|
- 新增内建函数需在 `sema.c`(注册签名)和 `codegen.c`(生成 IR)两处实现
|
|
|
|
## 提交格式
|
|
|
|
```
|
|
<类型>: <描述>
|
|
```
|
|
|
|
类型:`feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`
|
|
|
|
## 项目结构
|
|
|
|
```
|
|
src/
|
|
├── lexer/ 词法分析器
|
|
├── parser/ 语法分析器
|
|
├── ast/ AST 定义
|
|
├── sema/ 语义分析
|
|
├── codegen/ LLVM IR 生成
|
|
├── driver/ 主入口 + 错误报告
|
|
└── util/ 内存池
|
|
test/ 测试
|
|
docs/ 文档
|
|
```
|
|
|
|
## 开始贡献前
|
|
|
|
- 大改动建议先开 Issue 讨论
|
|
- 新语言特性需要在 `test/programs/` 添加对应的集成测试
|
|
- 不要引入编译警告
|