Files
l-language/CONTRIBUTING.md
Serendipity 3b7bab1e1b feat: L Language v0.1 编译器完整实现
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, 递归函数
2026-06-05 00:26:59 +08:00

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/` 添加对应的集成测试
- 不要引入编译警告