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, 递归函数
1.8 KiB
1.8 KiB
贡献指南
本地开发环境
- GCC 14.x+ (MinGW-w64)
- CMake 3.20+
- LLVM 22.x(需要 C API 库和头文件,路径见 CLAUDE.md)
开发流程
- Fork 本仓库
git clone <你的 fork>git checkout -b feature/xxx- 开发 + 测试
git commit(遵循约定式提交格式)git push- 提交 Pull Request
运行测试
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/添加对应的集成测试 - 不要引入编译警告