Files
l-language/CONTRIBUTING.md
T
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

1.8 KiB

贡献指南

本地开发环境

  • 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

运行测试

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.ccodegen.c
  • 新增 Token 类型需同步更新 lexer.cNAMES[] 数组
  • 新增内建函数需在 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/ 添加对应的集成测试
  • 不要引入编译警告