From 3b7bab1e1bf130a0c6973fa1a70cd69c2060da6d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com>
Date: Fri, 5 Jun 2026 00:26:59 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20L=20Language=20v0.1=20=E7=BC=96?=
=?UTF-8?q?=E8=AF=91=E5=99=A8=E5=AE=8C=E6=95=B4=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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, 递归函数
---
.gitignore | 37 +
CHANGELOG.md | 19 +
CLAUDE.md | 184 ++
CMakeLists.txt | 94 +
CODE_OF_CONDUCT.md | 36 +
CONTRIBUTING.md | 79 +
LICENSE | 21 +
README.md | 238 ++
SECURITY.md | 40 +
docs/PRD.md | 405 +++
.../plans/2026-06-04-l-lang-v0.1.md | 2512 +++++++++++++++++
include/l_lang.h | 38 +
src/ast/ast.c | 113 +
src/ast/ast.h | 96 +
src/codegen/codegen.c | 383 +++
src/codegen/codegen.h | 12 +
src/driver/error.c | 49 +
src/driver/error.h | 23 +
src/driver/main.c | 169 ++
src/lexer/lexer.c | 127 +
src/lexer/lexer.h | 13 +
src/lexer/token.c | 49 +
src/lexer/token.h | 45 +
src/parser/parser.c | 325 +++
src/parser/parser.h | 13 +
src/sema/sema.c | 264 ++
src/sema/sema.h | 12 +
src/sema/symbol.c | 48 +
src/sema/symbol.h | 40 +
src/util/arena.c | 45 +
src/util/arena.h | 17 +
test/programs/01_arithmetic.l | 5 +
test/programs/02_if_else.l | 9 +
test/programs/03_recurse.l | 11 +
test/programs/04_fib_recursive.l | 12 +
test/programs/05_float.l | 14 +
test/test_lexer.c | 53 +
test/test_parser.c | 68 +
test/test_sema.c | 59 +
test/test_utils.h | 27 +
40 files changed, 5804 insertions(+)
create mode 100644 .gitignore
create mode 100644 CHANGELOG.md
create mode 100644 CLAUDE.md
create mode 100644 CMakeLists.txt
create mode 100644 CODE_OF_CONDUCT.md
create mode 100644 CONTRIBUTING.md
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 SECURITY.md
create mode 100644 docs/PRD.md
create mode 100644 docs/superpowers/plans/2026-06-04-l-lang-v0.1.md
create mode 100644 include/l_lang.h
create mode 100644 src/ast/ast.c
create mode 100644 src/ast/ast.h
create mode 100644 src/codegen/codegen.c
create mode 100644 src/codegen/codegen.h
create mode 100644 src/driver/error.c
create mode 100644 src/driver/error.h
create mode 100644 src/driver/main.c
create mode 100644 src/lexer/lexer.c
create mode 100644 src/lexer/lexer.h
create mode 100644 src/lexer/token.c
create mode 100644 src/lexer/token.h
create mode 100644 src/parser/parser.c
create mode 100644 src/parser/parser.h
create mode 100644 src/sema/sema.c
create mode 100644 src/sema/sema.h
create mode 100644 src/sema/symbol.c
create mode 100644 src/sema/symbol.h
create mode 100644 src/util/arena.c
create mode 100644 src/util/arena.h
create mode 100644 test/programs/01_arithmetic.l
create mode 100644 test/programs/02_if_else.l
create mode 100644 test/programs/03_recurse.l
create mode 100644 test/programs/04_fib_recursive.l
create mode 100644 test/programs/05_float.l
create mode 100644 test/test_lexer.c
create mode 100644 test/test_parser.c
create mode 100644 test/test_sema.c
create mode 100644 test/test_utils.h
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cefb27b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,37 @@
+/bin/
+/build/
+/.idea/
+/.vscode/
+/.claude/
+/.trae/
+/.dist/
+*.iml
+
+# 代码图索引
+/.codegraph/
+
+# 编译产物
+*.o
+*.obj
+*.exe
+*.out
+*.a
+*.lib
+*.dll
+*.exp
+
+# LLVM IR
+*.ll
+*.bc
+
+# 临时文件
+*.tmp
+*.swp
+*~
+.DS_Store
+Thumbs.db
+
+# 归档
+*.zip
+*.tar.gz
+*.7z
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..235a3d7
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,19 @@
+# Changelog
+
+## 0.1.0 (2026-06-05)
+
+### Added
+- 词法分析器:手写状态机,40 种 Token 类型,支持 `//` 和 `/* */` 注释
+- 语法分析器:Pratt 表达式解析(9 级优先级)+ 递归下降语句/函数解析
+- AST:14 种节点类型,工厂函数模式创建
+- 语义分析器:作用域链符号表 + 类型推断 + 类型检查
+- LLVM IR 代码生成:全 AST 节点覆盖,内建 `print_i64` / `print_f64` / `print_bool`
+- 驱动程序:命令行参数解析 + 编译流水线串联 + `--emit-ir` 调试模式
+- Arena bump allocator (8MB)
+- 错误报告:ANSI 红色高亮,文件名:行号:列号 格式
+- 类型系统:`i64` / `f64` / `bool` / `void`,`let` 不可变变量,类型推断
+- 控制流:`if` / `else`,`while` 循环,`return` 语句
+- 函数:多参数、递归、可选返回类型标注
+- 65 个单元测试 (词法 41 + 语法 15 + 语义 9)
+- 5 个集成测试 (算术、分支、递归、斐波那契、浮点)
+- CMake 构建系统,静态库 + 可执行文件 + 测试分离
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..dfcb439
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,184 @@
+# CLAUDE.md
+
+## 项目概述
+
+L Language v0.1 — 用 C17 实现的静态类型编译型编程语言,Rust 风格语法,LLVM 22.x 后端。经典 5 阶段流水线:词法 → 语法 → 语义 → IR → 可执行文件。
+
+## 构建命令
+
+```bash
+# 配置(仅首次)
+cd build
+cmake .. -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH="D:/settings/Language/LLVM"
+
+# 编译
+mingw32-make -j4
+
+# 编译单个目标
+mingw32-make l_lang
+mingw32-make l_lang_lib
+```
+
+## 架构
+
+```
+源文件(.l) → 词法分析 → 语法分析 → 语义分析 → IR 生成 → 可执行文件
+ Token[] AstNode* 带类型AST LLVM Module .exe
+```
+
+```
+L Language/
+├── include/
+│ └── l_lang.h 公共头文件 (TypeKind 枚举, 向前声明)
+├── src/
+│ ├── lexer/
+│ │ ├── token.h/c Token {kind, start, length, line, col}
+│ │ └── lexer.h/c 手写状态机,40 种 Token 类型
+│ ├── parser/
+│ │ └── parser.h/c Pratt 表达式 (9 级优先级) + 递归下降语句
+│ ├── ast/
+│ │ └── ast.h/c 14 种节点 (PROGRAM..IDENT_EXPR) + 工厂函数
+│ ├── sema/
+│ │ ├── symbol.h/c 作用域链 (Scope* parent 链表)
+│ │ └── sema.h/c 类型推断 + 类型检查 + 3 个内建函数注册
+│ ├── codegen/
+│ │ └── codegen.h/c AST → LLVM-C API → LLVMModuleRef
+│ ├── driver/
+│ │ ├── main.c 入口 + 命令行解析 + 流水线串联
+│ │ └── error.h/c ErrorInfo / ErrorList 错误报告
+│ └── util/
+│ └── arena.h/c Bump allocator (8MB, 8 字节对齐)
+├── test/
+│ ├── test_utils.h 断言宏 (ASSERT / TEST_RUN / test_summary)
+│ ├── test_lexer.c 词法测试 (41 tests)
+│ ├── test_parser.c 语法测试 (15 tests)
+│ ├── test_sema.c 语义测试 (9 tests)
+│ └── programs/ .l 集成测试 (5 个程序)
+├── docs/
+│ ├── PRD.md 产品需求文档
+│ └── superpowers/plans/ 实现计划
+├── CMakeLists.txt l_lang_lib (静态库) + l_lang (exe) + 测试
+└── README.md
+```
+
+## 核心 API 参考
+
+### 词法分析
+
+```c
+// lexer.h
+Token* lex(Arena* a, const char* source, const char* filename,
+ size_t* count, ErrorInfo* error);
+// 返回: Token 数组(分配在 arena),出错返回 NULL
+// Token: {TokenKind kind, const char* start, int length, int line, int col}
+```
+
+### 语法分析
+
+```c
+// parser.h
+AstNode* parse(Arena* a, const Token* tokens, size_t count,
+ const char* filename, ErrorInfo* error);
+// 返回: AST_PROGRAM 节点,出错返回 NULL
+// 支持: 所有语句 (let/if/while/return) + 表达式 (Pratt precedence climbing)
+```
+
+### 语义分析
+
+```c
+// sema.h
+void sema_analyze(AstNode* ast, ErrorList* errors, Arena* arena);
+// 副作用: AST 节点填充 type 字段, errors 收集类型错误
+// 内建: scope_insert_function(print_i64, print_f64, print_bool)
+```
+
+### 代码生成
+
+```c
+// codegen.h
+LLVMModuleRef codegen_module(AstNode* ast, const char* module_name,
+ const char** error_msg);
+// 返回: 已验证的 LLVM Module,出错返回 NULL
+// 内建 print_* 函数生成对应的 printf 调用
+```
+
+## 类型系统
+
+| L 类型 | LLVM 类型 | C 常量创建 |
+|--------|-----------|-----------|
+| `i64` | `LLVMInt64Type()` | `LLVMConstInt(ty, val, true)` |
+| `f64` | `LLVMDoubleType()` | `LLVMConstReal(ty, val)` |
+| `bool` | `LLVMInt1Type()` | `LLVMConstInt(ty, val, false)` |
+| `void` | `LLVMVoidType()` | — |
+
+类型推断规则:
+- 字面量:`42` → `i64`, `3.14` → `f64`, `true` → `bool`
+- `let x = expr` → 从 expr 推断
+- `let x: i64 = expr` → 显式标注优先
+- 算术运算:i64 + i64 → i64, i64 + f64 → f64 (提升)
+- 比较运算:返回 `bool`
+
+## 运算符优先级
+
+| 优先级 | 运算符 |
+|--------|--------|
+| 70 (最高) | `-` (一元负), `!` (一元非) |
+| 60 | `*` `/` `%` |
+| 50 | `+` `-` |
+| 40 | `==` `!=` `<` `>` `<=` `>=` |
+| 30 | `&&` |
+| 20 | `\|\|` |
+| 10 (最低) | — |
+
+## 错误处理
+
+| 阶段 | 策略 |
+|------|------|
+| 词法分析 | 首个非法字符 → 立即终止,返回 ErrorInfo |
+| 语法分析 | 首个语法错误 → 立即终止,返回 ErrorInfo |
+| 语义分析 | 收集所有类型错误到 ErrorList → 批量输出 (ANSI 红色) |
+| IR 生成 | LLVMVerifyModule → 返回 char* 错误消息 |
+| 链接 | system() 返回值检查 → 打印 exit code |
+| 分配失败 | arena_alloc 返回 NULL → 逐层检查 |
+
+
+## 测试
+
+```bash
+# 单元测试 (每个 test_*.c 独立编译运行,各有自己的 main)
+./l_lang_lexer_test.exe # 41 个断言
+./l_lang_test.exe # 15 个断言
+./l_lang_sema_test.exe # 9 个断言
+
+# 集成测试 (编译 .l → 运行 .exe → 检查输出)
+for f in ../test/programs/*.l; do
+ echo "=== $f ==="
+ ./l_lang.exe "$f" -o /tmp/out.exe && /tmp/out.exe
+done
+```
+
+## 关键约束
+
+- **C17 标准**:`-Wall -Wextra -g`,零编译警告
+- **Arena 分配**:Token、AST、符号表全部从 arena 分配,无 malloc/free 散落
+- **LLVM 路径**:`D:\settings\Language\LLVM`,C API 头文件手动补充(v22.1.7 预编译包缺少部分头文件)
+- **链接器**:MinGW 环境用 **gcc** 链接(非 clang,避免 MSVC 依赖)
+- **Windows**:仅支持 Windows 11 + MinGW-w64
+- **错误消息**:中文,格式 `文件名:行号:列号: 描述`
+
+## 已知限制 (v0.1)
+
+- `let` 变量不可变(无 `mut`),循环计数器无法修改 — 迭代算法需递归实现
+- 无字符串类型(`print_*` 是编译器内建,非语言特性)
+- 无数组、结构体、枚举、泛型、trait
+- 无模块系统(所有函数在单文件)
+- 作用域未清理(同函数内变量名不可重用)
+- `main` 返回值未被 OS 使用(需 CRT 包装)
+
+## 版本号升级清单
+
+| 文件 | 字段 |
+|------|------|
+| `CMakeLists.txt` | `VERSION` 变量 |
+| `README.md` | badges |
+| `CHANGELOG.md` | 版本标题 |
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..53aacdd
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,94 @@
+cmake_minimum_required(VERSION 3.20)
+project(l_lang C)
+
+set(CMAKE_C_STANDARD 17)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+
+# === LLVM 配置 ===
+set(LLVM_PREFIX "D:/settings/Language/LLVM" CACHE PATH "LLVM installation prefix")
+
+# 查找 LLVM(优先使用 CONFIG 模式,失败则手动配置)
+find_package(LLVM 19 QUIET CONFIG
+ HINTS ${LLVM_PREFIX}/lib/cmake/llvm
+ ${LLVM_PREFIX}/cmake
+)
+
+if(NOT LLVM_FOUND)
+ message(STATUS "LLVM CONFIG not found — using manual LLVM paths")
+ set(LLVM_FOUND TRUE)
+ set(LLVM_INCLUDE_DIRS "${LLVM_PREFIX}/include")
+ set(LLVM_LIBRARY_DIR "${LLVM_PREFIX}/lib")
+ set(LLVM_LIBRARIES "${LLVM_PREFIX}/lib/LLVM-C.lib")
+ # 标记使用手动模式
+ set(LLVM_MANUAL_MODE ON)
+else()
+ message(STATUS "LLVM found: ${LLVM_DIR}")
+ message(STATUS "LLVM includes: ${LLVM_INCLUDE_DIRS}")
+ message(STATUS "LLVM available libs: ${LLVM_AVAILABLE_LIBS}")
+ set(LLVM_MANUAL_MODE OFF)
+endif()
+
+# === 编译器库(不含 main.c,供测试复用)===
+file(GLOB_RECURSE L_LANG_LIB_SOURCES "src/*.c")
+list(REMOVE_ITEM L_LANG_LIB_SOURCES "${CMAKE_SOURCE_DIR}/src/driver/main.c")
+
+add_library(l_lang_lib STATIC ${L_LANG_LIB_SOURCES})
+target_include_directories(l_lang_lib PRIVATE
+ ${CMAKE_SOURCE_DIR}/include
+ ${LLVM_INCLUDE_DIRS}
+ src/util src/lexer src/ast src/parser src/sema src/codegen src/driver
+)
+target_compile_options(l_lang_lib PRIVATE -Wall -Wextra -g)
+
+# === 编译器可执行文件 ===
+add_executable(l_lang src/driver/main.c)
+target_link_libraries(l_lang PRIVATE l_lang_lib)
+target_include_directories(l_lang PRIVATE
+ ${CMAKE_SOURCE_DIR}/include
+ ${LLVM_INCLUDE_DIRS}
+ src/util src/lexer src/ast src/parser src/sema src/codegen src/driver
+)
+
+# === 链接 LLVM(通过库)===
+if(LLVM_MANUAL_MODE)
+ target_link_libraries(l_lang_lib PUBLIC ${LLVM_LIBRARIES})
+ message(STATUS "Linking LLVM manually: ${LLVM_LIBRARIES}")
+else()
+ target_link_libraries(l_lang_lib PUBLIC LLVM)
+endif()
+
+# === LLVM 定义 ===
+if(NOT LLVM_MANUAL_MODE)
+ target_compile_definitions(l_lang_lib PRIVATE ${LLVM_DEFINITIONS})
+endif()
+
+# === 测试可执行文件(每个测试文件独立编译,各有自己的 main)===
+# Parser 测试
+add_executable(l_lang_test test/test_parser.c)
+target_link_libraries(l_lang_test PRIVATE l_lang_lib)
+target_include_directories(l_lang_test PRIVATE
+ ${CMAKE_SOURCE_DIR}/include
+ ${LLVM_INCLUDE_DIRS}
+ src/util src/lexer src/ast src/parser src/sema src/codegen src/driver
+ test
+)
+
+# Lexer 测试
+add_executable(l_lang_lexer_test test/test_lexer.c)
+target_link_libraries(l_lang_lexer_test PRIVATE l_lang_lib)
+target_include_directories(l_lang_lexer_test PRIVATE
+ ${CMAKE_SOURCE_DIR}/include
+ ${LLVM_INCLUDE_DIRS}
+ src/util src/lexer src/ast src/parser src/sema src/codegen src/driver
+ test
+)
+
+# Sema 测试
+add_executable(l_lang_sema_test test/test_sema.c)
+target_link_libraries(l_lang_sema_test PRIVATE l_lang_lib)
+target_include_directories(l_lang_sema_test PRIVATE
+ ${CMAKE_SOURCE_DIR}/include
+ ${LLVM_INCLUDE_DIRS}
+ src/util src/lexer src/ast src/parser src/sema src/codegen src/driver
+ test
+)
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..14d1247
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,36 @@
+# 贡献者行为准则
+
+## 我们的承诺
+
+为了营造一个开放和友好的环境,我们作为贡献者和维护者承诺:无论年龄、体型、残障、种族、性别认同和表达、经验水平、国籍、个人外貌、宗教、性取向或身份,参与本项目不会受到骚扰。
+
+## 我们的标准
+
+有助于创造积极环境的行为包括:
+
+- 使用友好和包容的语言
+- 尊重不同的观点和经验
+- 优雅地接受建设性批评
+- 关注对社区最有利的事情
+- 对其他社区成员表示同理心
+
+不可接受的行为包括:
+
+- 使用性暗示语言或图像以及不受欢迎的性关注
+- 侮辱/贬损性评论以及人身攻击或政治攻击
+- 公开或私下的骚扰
+- 未经明确许可发布他人的私人信息
+
+## 我们的责任
+
+项目维护者有责任澄清可接受行为的标准,并应对任何不可接受的行为采取适当和公平的纠正措施。
+
+## 范围
+
+本行为准则适用于项目空间和代表项目的公共空间。
+
+## 执行
+
+可通过 GitHub Issues 或直接联系维护者报告辱骂、骚扰或其他不可接受的行为。所有投诉将被审查和调查,并将产生被认为必要且适合情况的回应。
+
+本项目改编自 [Contributor Covenant](https://www.contributor-covenant.org) 2.1 版。
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..40d8d1d
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,79 @@
+# 贡献指南
+
+## 本地开发环境
+
+- **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/` 添加对应的集成测试
+- 不要引入编译警告
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..fb01715
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 刘航宇 (LHY0125)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..352eff4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,238 @@
+
+
L Language
+ 用 C17 实现的静态类型编译型编程语言
+
+
+
+
+
+
+
+
+
+
+
+---
+
+## 简介
+
+L Language 是一门学习型编译语言,手写词法分析、递归下降 + Pratt 解析、语义分析和 LLVM IR 代码生成,最终生成原生可执行文件。语法借鉴 Rust,类型系统支持类型推断。
+
+```rust
+fn fib(n: i64) -> i64 {
+ if n < 2 { return n; }
+ return fib(n - 1) + fib(n - 2);
+}
+
+fn main() -> i64 {
+ print_i64(fib(10)); // 输出 55
+ return 0;
+}
+```
+
+## 架构
+
+```
+源码(.l) → 词法分析(Token) → 语法分析(AST) → 语义分析(类型标注) → LLVM IR → 可执行文件
+```
+
+```mermaid
+graph TB
+ subgraph 前端["编译器前端"]
+ Lexer[词法分析器
手写状态机
40 种 Token]
+ Parser[语法分析器
递归下降 + Pratt
14 种 AST 节点]
+ Sema[语义分析器
作用域链 + 类型推断
类型检查 + 错误收集]
+ end
+
+ subgraph 后端["编译器后端"]
+ Codegen[LLVM IR 生成
AST → LLVM-C API
内建 print 函数]
+ Link[链接器
clang/lld
生成 .exe]
+ end
+
+ subgraph 运行时["运行时支持"]
+ Builtins[内建函数
print_i64 / print_f64
print_bool → printf]
+ end
+
+ Source[源码 .l] --> Lexer
+ Lexer --> Parser
+ Parser --> Sema
+ Sema --> Codegen
+ Codegen --> Link
+ Link --> Exe[可执行文件 .exe]
+ Builtins -.-> Codegen
+```
+
+### 模块职责
+
+| 模块 | 输入 | 输出 | 核心结构 |
+|------|------|------|----------|
+| `lexer/` | `char*` 源码 | `Token[]` | `Token` {kind, start, length, line, col} |
+| `parser/` | `Token[]` | `AstNode*` | 14 种节点 (Program..IdentExpr) |
+| `ast/` | — | 工厂函数 | `AstNode` {kind, type, as{union}} |
+| `sema/` | `AstNode*` | 类型标注 | `Scope` 作用域链 + `Symbol` 符号表 |
+| `codegen/` | `AstNode*` | `LLVMModuleRef` | `CgCtx` {module, builder, var_table} |
+| `driver/` | 命令行参数 | exit code | 流水线串联 + 错误报告 |
+
+## 功能 (v0.1)
+
+### 类型系统
+
+| 类型 | 关键字 | 说明 |
+|------|--------|------|
+| 64 位有符号整数 | `i64` | `42`, `-7` |
+| 64 位浮点数 | `f64` | `3.14`, `-0.5` |
+| 布尔值 | `bool` | `true`, `false` |
+| 无返回值 | `void` | 函数不返回值时使用 |
+
+- `let` 不可变变量,支持可选类型标注和类型推断
+- 类型在编译时完全确定,无隐式转换(除 `i64` → `f64` 自动提升)
+
+### 控制流
+
+- `if` / `else` 条件分支(支持 `else if` 链)
+- `while` 循环
+- `return` 提前返回(可选带表达式)
+
+### 函数
+
+- 多参数,显式返回类型(可省略,默认 `void`)
+- 递归调用
+- 内建函数:`print_i64`, `print_f64`, `print_bool`
+
+## 安装
+
+### 依赖
+
+- **GCC** 15.x (MinGW-w64)
+- **CMake** ≥ 3.20
+- **LLVM** 22.x(C API 库 + 头文件)
+
+### 从源码构建
+
+```bash
+git clone
+cd "L Language"
+mkdir build && cd build
+cmake .. -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH="D:/settings/Language/LLVM"
+mingw32-make -j4
+```
+
+生成 `l_lang.exe`。
+
+## 使用
+
+```bash
+# 编译并运行
+./l_lang.exe example.l -o example.exe
+./example.exe
+
+# 查看生成的 LLVM IR
+./l_lang.exe example.l --emit-ir
+```
+
+## 开发
+
+```bash
+# 构建
+cd build && mingw32-make -j4
+
+# 运行全部测试 (65 单元 + 5 集成)
+./l_lang_lexer_test.exe # 词法分析 (41 tests)
+./l_lang_test.exe # 语法分析 (15 tests)
+./l_lang_sema_test.exe # 语义分析 (9 tests)
+
+# 集成测试
+for f in ../test/programs/*.l; do
+ ./l_lang.exe "$f" -o out.exe && ./out.exe
+done
+```
+
+### 技术栈
+
+| 层 | 技术 |
+|----|------|
+| 实现语言 | C17 (GCC 15.x) |
+| 构建系统 | CMake 3.20+ |
+| IR 后端 | LLVM 22.1.7 C API |
+| 链接器 | clang / lld |
+| 内存管理 | Arena bump allocator |
+| 测试框架 | 手写断言宏 (ASSERT / TEST_RUN / test_summary) |
+
+### 项目结构
+
+```
+include/l_lang.h # 公共类型定义 (TypeKind, 向前声明)
+src/
+├── lexer/ # 词法分析器
+│ ├── token.h/c # Token 类型 + 工具函数
+│ └── lexer.h/c # 状态机 lex()
+├── parser/
+│ └── parser.h/c # Pratt 表达式 + 递归下降 parse()
+├── ast/
+│ └── ast.h/c # 14 种节点定义 + 创建函数
+├── sema/
+│ ├── symbol.h/c # 作用域链 (查/插)
+│ └── sema.h/c # 类型推断 + 检查 sema_analyze()
+├── codegen/
+│ └── codegen.h/c # AST → LLVM IR codegen_module()
+├── driver/
+│ ├── main.c # 入口 + 命令行 + 流水线串联
+│ └── error.h/c # 错误报告 (ErrorInfo / ErrorList)
+└── util/
+ └── arena.h/c # Bump allocator (8MB)
+test/
+├── test_utils.h # 断言宏
+├── test_lexer.c # 词法测试 (41 tests)
+├── test_parser.c # 语法测试 (15 tests)
+├── test_sema.c # 语义测试 (9 tests)
+└── programs/ # 集成测试 (.l 源文件)
+docs/
+├── PRD.md # 产品需求文档
+└── superpowers/plans/ # 实现计划
+```
+
+## 错误处理
+
+| 阶段 | 策略 |
+|------|------|
+| 词法分析 | 首个非法字符即终止,报告 文件名:行:列: 错误信息 |
+| 语法分析 | 首个语法错误即终止,报告期望 vs 实际 |
+| 语义分析 | 收集所有类型错误后批量输出,红色 ANSI 高亮 |
+| IR 生成 | LLVMVerifyModule 验证失败 → 输出 LLVM 诊断 |
+| 链接 | system() 返回值检查,失败时打印 exit code |
+
+## 贡献
+
+欢迎提交 Issue 和 Pull Request。
+
+### 本地开发环境
+
+- GCC 14.x+ (MinGW-w64)
+- CMake 3.20+
+- LLVM 22.x(需要 C API 库和头文件)
+
+### 代码规范
+
+- C17 标准,`-Wall -Wextra -g` 零警告
+- 注释用中文
+- Arena 内存池贯穿全流水线,不在局部函数内 malloc
+- 错误信息格式:`文件名:行:列: 描述`
+- 提交格式:`<类型>: <描述>`(feat/fix/refactor/docs/test/chore)
+
+## 版本号升级清单
+
+版本号需在 **3 个地方** 手动修改:
+
+| 文件 | 字段 | 说明 |
+|------|------|------|
+| `CMakeLists.txt` | `VERSION` 变量 | CMake `project()` |
+| `README.md` | badges | 文档徽章 |
+| `CHANGELOG.md` | 版本标题 | 变更日志 |
+
+## 许可证
+
+MIT License
+
+## 作者
+
+[刘航宇](https://github.com/LHY0125) — 河南理工大学人工智能协会
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..a9970ff
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,40 @@
+# 安全策略
+
+## 报告漏洞
+
+如果你发现安全漏洞,请**不要**在公开 Issue 中报告。请通过以下方式私下报告:
+
+- GitHub: 在 [Security Advisories](https://github.com/LHY0125/l-language/security/advisories) 页面提交
+- 邮件: 联系项目维护者
+
+我们会在 **48 小时内**确认收到报告,并在 7 天内提供初步评估和修复计划。
+
+## 安全最佳实践
+
+### 作为用户
+
+- 仅从 [Releases](https://github.com/LHY0125/l-language/releases) 页面下载编译好的二进制文件
+- 编译的 `.l` 源文件在当前目录生成 `.o` 和 `.exe` 文件
+- 不要编译不可信来源的 `.l` 源文件
+
+### 作为开发者
+
+- 永远不要在源代码中硬编码密钥或凭据
+- 所有外部输入(源文件)在系统边界验证
+- Arena 分配失败时逐层返回 NULL,不做静默回退
+- `vsnprintf` 缓冲区用完时检查返回值
+- `strtoll` / `strtod` 解析 Token 值前检查长度边界
+
+## 已知限制
+
+- v0.1 不支持沙箱或权限控制 — 编译出的可执行文件具有当前用户的所有权限
+- `print_*` 内建函数直接调用 `printf`,format string 为硬编码常量,无注入风险
+- 不支持文件 I/O、网络、外部 FFI 调用(v0.1 语言能力有限,攻击面极小)
+
+## 支持版本
+
+| 版本 | 支持状态 |
+|------|----------|
+| v0.1.x | 活跃开发中 |
+
+> v0.1 处于早期开发阶段,API 和语言语法可能发生破坏性变更。生产环境请勿使用。
diff --git a/docs/PRD.md b/docs/PRD.md
new file mode 100644
index 0000000..34d4f8a
--- /dev/null
+++ b/docs/PRD.md
@@ -0,0 +1,405 @@
+# L Language PRD(产品需求文档)
+
+> 版本: v0.1 | 日期: 2026-06-04 | 作者: 刘航宇 (AI 辅助)
+
+---
+
+## 1. 项目概述
+
+### 1.1 一句话描述
+
+用 C 语言实现一门静态类型、Rust 风格语法、多范式混合的编译型编程语言 "L Language"。
+
+### 1.2 目标
+
+| | 短期(v0.1) | 远期 |
+|---|-------------|------|
+| 定位 | 学习编译器全流程 | 真正能用的通用编程语言 |
+| 能力 | 计算器级 — 基本类型、算术、if/while、函数 | 模块、泛型、trait、所有权等 |
+| 标准 | 跑通全流水线就是胜利 | 自举 |
+
+### 1.3 非目标(v0.1 不做)
+
+- 字符串类型(只有字面量用于 `print`)
+- 数组 / 切片 / 结构体
+- 模块系统和多文件编译
+- 泛型、trait、模式匹配
+- 任何标准库
+- 垃圾回收或自动内存管理
+
+---
+
+## 2. 语言规范(v0.1)
+
+### 2.1 类型系统
+
+| 类型 | 关键字 | 占位 | 示例 |
+|------|--------|------|------|
+| 有符号 64 位整数 | `i64` | 64 bit | `42`、`-7` |
+| 64 位浮点数 | `f64` | 64 bit | `3.14`、`-0.5` |
+| 布尔值 | `bool` | 1 bit | `true`、`false` |
+| 无返回值 | `void` | — | 函数不返回值时使用 |
+
+类型推断规则:
+- `let` 声明时从初始化表达式推断类型,无需显式标注
+- 函数参数和返回值必须显式标注类型
+- 变量一旦推断出类型就固定(强类型、静态类型)
+
+### 2.2 语法(EBNF 摘要)
+
+```ebnf
+program = { function }
+function = "fn" IDENT "(" [params] ")" ["->" type] block
+params = param { "," param }
+param = IDENT ":" type
+type = "i64" | "f64" | "bool" | "void"
+
+block = "{" { statement } [expression] "}"
+statement = let_stmt | if_stmt | while_stmt | return_stmt | expr_stmt
+let_stmt = "let" IDENT "=" expression ";" (* 变量不可变,无赋值语句 *)
+if_stmt = "if" expression block ["else" (if_stmt | block)]
+while_stmt = "while" expression block
+return_stmt = "return" [expression] ";"
+expr_stmt = expression ";"
+
+expression = logical_or
+logical_or = logical_and { "||" logical_and }
+logical_and = comparison { "&&" comparison }
+comparison = term { ("==" | "!=" | "<" | ">" | "<=" | ">=") term }
+term = factor { ("+" | "-") factor }
+factor = unary { ("*" | "/" | "%") unary }
+unary = ("-" | "!") unary | primary
+primary = NUMBER | BOOL | IDENT | call | "(" expression ")"
+call = IDENT "(" [args] ")"
+args = expression { "," expression }
+```
+
+### 2.3 内置函数(编译器提供,非语言特性)
+
+| 函数 | 说明 |
+|------|------|
+| `print_i64(x: i64) -> void` | 打印整数并换行 |
+| `print_f64(x: f64) -> void` | 打印浮点数并换行 |
+| `print_bool(x: bool) -> void` | 打印布尔值并换行 |
+
+### 2.4 示例程序
+
+```rust
+fn fib(n: i64) -> i64 {
+ if n < 2 {
+ return n;
+ }
+ return fib(n - 1) + fib(n - 2);
+}
+
+fn main() -> i64 {
+ let result = fib(10);
+ print_i64(result); // 输出: 55
+ return 0;
+}
+```
+
+---
+
+## 3. 编译器架构
+
+### 3.1 整体流水线
+
+```
+源文件(.l) ──▶ 词法分析 ──▶ 语法分析 ──▶ 语义分析 ──▶ IR生成 ──▶ 可执行文件(.exe)
+ Token流 AST 带类型AST LLVM Module 机器码
+```
+
+### 3.2 各阶段输入输出
+
+| 阶段 | 输入 | 输出 | 关键数据结构 |
+|------|------|------|-------------|
+| 词法分析 | `char*` 源码 | Token 数组 | `Token`(类型 + 行号 + 列号 + 值)|
+| 语法分析 | Token 数组 | AST 根节点 | `AstNode`(递归树,每个节点有类型枚举 + 子节点)|
+| 语义分析 | AST 根节点 | 带类型标注的 AST | 在 `AstNode` 上附加 `TypeInfo` |
+| IR 生成 | 带类型 AST | LLVM Module | `LLVMModuleRef`、`LLVMValueRef` 等 |
+| 代码生成 | LLVM Module | `.exe` 可执行文件 | LLVM 的 `LLVMTargetMachineEmitToFile` |
+
+### 3.3 错误处理策略
+
+- 词法/语法错误:打印 `文件:行号:列号: 错误信息` 后立即终止
+- 语义错误(类型不匹配等):收集当前阶段所有错误后统一输出,再终止
+- 不尝试错误恢复,不做增量编译
+
+---
+
+## 4. 模块详细设计
+
+### 4.1 词法分析器(Lexer)
+
+**职责**:将源代码字符串转换为 Token 流
+
+**Token 类型清单**:
+
+| 类别 | Token |
+|------|-------|
+| 关键字 | `fn` `let` `if` `else` `while` `return` `true` `false` |
+| 类型 | `i64` `f64` `bool` `void` |
+| 字面量 | 整数、浮点数 |
+| 标识符 | 用户定义的变量名、函数名 |
+| 运算符/分隔 | `+` `-` `*` `/` `%` `==` `!=` `<` `>` `<=` `>=` `&&` `||` `!` `=` `->` `(` `)` `{` `}` `,` `:` `;` |
+
+**实现要点**:
+- 手写状态机,不依赖 flex/lex
+- 跳过空白(空格、`\t`、`\r`)和注释(`//` 行注释 + `/* */` 块注释)
+- 每个 Token 记录行号和列号,用于错误报告
+- 关键字通过哈希表或完美哈希识别
+
+**关键函数签名**:
+```c
+Token* lex(const char* source, size_t* token_count, ErrorInfo* error);
+```
+
+### 4.2 语法分析器(Parser)
+
+**职责**:将 Token 流转换为抽象语法树
+
+**实现方式**:手写递归下降解析器(Pratt parsing 处理表达式)
+
+**AST 节点类型**:
+
+```
+Program — 程序根节点,包含多个函数
+Function — 函数定义(名称、参数列表、返回类型、函数体)
+Parameter — 函数参数(名称、类型)
+Block — 代码块,包含语句列表
+LetStmt — let 声明(不可变变量)
+IfStmt — if 语句(条件、then块、可选的else块)
+WhileStmt — while 循环
+ReturnStmt — return 语句
+BinaryExpr — 二元运算(运算符 + 左右操作数)
+UnaryExpr — 一元运算(-、!)
+CallExpr — 函数调用
+LiteralExpr — 字面量(整数、浮点、布尔)
+IdentifierExpr — 标识符引用
+```
+
+**关键函数签名**:
+```c
+AstNode* parse(const Token* tokens, size_t token_count, ErrorInfo* error);
+```
+
+### 4.3 语义分析器(Sema / Semantic Analyzer)
+
+**职责**:类型推断和类型检查
+
+**核心工作**:
+1. **符号表管理** — 作用域栈(全局作用域 → 函数作用域 → 块作用域)
+2. **类型推断** — 从 `let x = 42` 推断出 `x: i64`
+3. **类型检查** — `if`/`while` 条件必须是 `bool`;二元运算两边类型必须一致
+4. **隐式类型转换** — 整数可自动提升为浮点数(`i64` → `f64`)
+5. **函数签名检查** — 调用时参数数量和类型必须匹配声明
+6. **未定义检查** — 所有引用的标识符必须在作用域内已定义
+
+**数据结构**:
+```c
+typedef struct {
+ const char* name; // 符号名称
+ TypeKind type; // 推断出的类型
+ SymbolKind kind; // 变量 / 参数 / 函数
+ // 函数符号额外信息
+ TypeKind return_type;
+ TypeKind* param_types;
+ size_t param_count;
+} Symbol;
+
+typedef struct Scope {
+ Symbol* symbols; // 当前作用域的符号表
+ size_t count;
+ struct Scope* parent; // 上级作用域
+} Scope;
+```
+
+**关键函数签名**:
+```c
+void analyze(AstNode* ast, ErrorList* errors);
+```
+
+### 4.4 LLVM IR 生成器(Codegen)
+
+**职责**:遍历带类型的 AST,调用 LLVM-C API 生成 LLVM IR
+
+**类型映射**:
+
+| L 类型 | LLVM 类型 |
+|--------|-----------|
+| `i64` | `LLVMInt64Type()` |
+| `f64` | `LLVMDoubleType()` |
+| `bool` | `LLVMInt1Type()` |
+| `void` | `LLVMVoidType()` |
+
+**各 AST 节点的生成策略**:
+
+| AST 节点 | IR 生成策略 |
+|----------|------------|
+| `Function` | 创建 `LLVMAddFunction`,分配 entry BB,生成函数体 |
+| `Block` | 顺序生成每条语句/表达式 |
+| `LetStmt` | `alloca` 分配栈空间,计算初始化表达式,`store` |
+| `BinaryExpr` | 生成左右操作数,按运算符选 `LLVMBuildAdd`/`LLVMBuildSub`/... |
+| `IfStmt` | 创建 3 个 BB: then/else/merge,`LLVMBuildCondBr` |
+| `WhileStmt` | 创建 cond/body/merge 三个 BB,`LLVMBuildCondBr` + `LLVMBuildBr` |
+| `CallExpr` | 查找函数,`LLVMBuildCall2` |
+| `ReturnStmt` | `LLVMBuildRet` |
+| `LiteralExpr` | `LLVMConstInt`/`LLVMConstReal` |
+| 标识符读取 | 从 `alloca` 地址 `LLVMBuildLoad2` |
+
+**内置函数实现**:`print_i64`/`print_f64`/`print_bool` 在编译器内部用 C `printf` 实现,生成时直接映射到 LLVM IR 调用 `printf`。
+
+**关键函数签名**:
+```c
+LLVMModuleRef codegen(AstNode* ast, const char* module_name);
+```
+
+### 4.5 驱动层(Driver)
+
+**职责**:串联各阶段,处理命令行参数
+
+```
+l-language.exe [-o