# Compilier-TJU **Repository Path**: fenling18/compilier ## Basic Information - **Project Name**: Compilier-TJU - **Description**: 天津大学编译原理大作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-29 - **Last Updated**: 2025-11-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README C-- Compiler Project (2025 Autumn Compiler Principles) 本项目是天津大学 2025 秋季《编译原理》课程大作业的 C-- 语言编译器前端实现 。 该编译器完全手写实现(不使用 Lex/Yacc 等自动生成工具),能够将 C-- 源代码(.sy)经过词法分析、语法分析(SLR),最终转换为 LLVM IR 中间代码 。 📌 项目特性 (Features) 词法分析器 (Lexer) 基于 有限自动机 (DFA) 理论手工构建。 支持识别关键字、标识符、整数、浮点数、运算符及界符。 输出格式符合课程要求的二元式序列:[Token] <[Type], [Value]>。 语法分析器 (Parser) 基于 SLR(1) 自底向上分析算法。 实现了自动化的 FIRST 集、FOLLOW 集 计算。 实现了 LR(0) 项目集规范族 构造及 SLR 分析表 生成。 能够构建完整的 抽象语法树 (AST)。 输出详细的移进 (Move) / 归约 (Reduction) 序列。 中间代码生成 (Code Generation) 基于 Visitor 模式 遍历 AST。 实现了 栈式符号表 (Scope Stack) 管理,支持变量遮蔽。 支持 全局变量 与 局部变量 的定义与初始化。 支持 控制流语句 (if, else, block)。 支持 函数定义、函数调用 及 递归调用。 支持 复杂表达式 计算(含二元运算、单目运算、比较运算)。 最终生成标准的 LLVM IR (.ll 格式)。 📂 项目结构 (Structure) Plaintext CompilerProject/ ├── CMakeLists.txt # CMake 构建配置 ├── main.cpp # 编译器总控程序 ├── include/ │ ├── lexer/ # 词法分析头文件 (Lexer.h, Token.h) │ ├── parser/ # 语法分析头文件 (Parser.h, Grammar.h, AST.h) │ └── codegen/ # 代码生成头文件 (CodeGen.h, Scope.h) ├── src/ │ ├── lexer/ # 词法分析实现 │ ├── parser/ # 语法分析实现 (Parser.cpp, Grammar.cpp, GrammarBuilder.cpp) │ └── codegen/ # 代码生成实现 (CodeGen.cpp) ├── middle_end/ # [提供的] 中端接口库 (Module, IRBuilder, Value 等) └── test/ # 测试用例目录 (.sy 文件) 🛠️ 构建与运行 (Build & Run) 本项目使用 CMake 进行构建,推荐使用 C++17 标准。 前置依赖 C++ 编译器 (MinGW g++ / Clang / MSVC) CMake (>= 3.10) 编译步骤 在项目根目录下执行以下命令: Bash # 1. 创建构建目录 mkdir build cd build # 2. 生成 Makefile (Windows MinGW 环境) cmake -G "MinGW Makefiles" .. # 3. 编译 make # 或者使用 mingw32-make 编译成功后,将在 build/ 目录下生成 compiler.exe 可执行文件。 运行编译器 Bash ./compiler.exe 示例: Bash ./compiler.exe ../test/test.sy 📝 输出说明 (Output) 程序运行后,标准输出 (stdout) 将包含三个部分,严格对应大作业的三个阶段: 词法分析输出: Plaintext int main ( ... 语法分析输出 (归约序列): Plaintext 1 ##int move 2 int#main reduction ... 43 CompUnit## reduction 44 ## accept 中间代码输出 (LLVM IR): 代码段 define i32 @main() { label_entry: %op0 = alloca i32 store i32 10, i32* %op0 ... ret i32 %op_ret } ✅ 测试覆盖 (Tests) 编译器已通过以下场景的测试: 基础功能:int main() { return 0; } 变量管理:全局变量、局部变量、同名变量作用域遮蔽。 算术运算:加减乘除模、正负号、逻辑非。 控制流:if-else 跳转、嵌套代码块。 函数特性:多参数传递、递归调用 (如阶乘计算)。 👥 作者 (Author) 学号/姓名: [您的名字] 课程: 2025 秋季编译原理 注:本项目代码逻辑参考自 SysY 语言规范及 LLVM IR 设计文档。