# compiler_finalhw **Repository Path**: pan-yunyi/compiler_finalhw ## Basic Information - **Project Name**: compiler_finalhw - **Description**: 编译原理与技术大作业 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-26 - **Last Updated**: 2025-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C-- 编译器前端 (词法+语法分析版) 编译原理大作业的前端部分。目前已经实现**词法分析**和**语法分析**的核心功能,代码可以直接运行。 ## 1. 目前进度 已经完成了以下工作: * **词法分析器**:能识别代码里的 int、main、if、else、数字、加减乘除等。它是基于自动机(NFA/DFA)实现的,符合老师要求。 * **语法分析器**:能把单词串成句子,识别出变量定义、函数定义、表达式等语法结构。使用了 SLR 算法,解决了部分语法冲突。 **后续任务:** * **中间代码生成**:需要在 `parser.cpp` 里解析成功的地方,插入生成代码的逻辑(比如生成三地址码)。 ## 2. 怎么运行 需要安装 C++ 编译器(MinGW 或 GCC)。 ### 编译代码 在项目根目录下,打开终端(命令行),输入: mingw32-make # Windows 或者 make # Linux/Mac如果编译成功,生成 `lexer_test.exe` 。 ### 运行测试 准备一个测试文件(例如 `test/test.sy`),然后运行: .\lexer_test.exe test/test.sy test/test.ref* `test/test.sy`: 你的 C-- 源代码。 * `test/test.ref`: 输出结果文件。 运行后,**控制台会打印出详细的分析过程**,包括每一步是怎么归约的。 现在的test.ref都是我的测试结果。 ## 3. 项目文件说明 * **`src/main.cpp`**: 程序的入口。先调用词法分析,再调用语法分析。 * **`src/lexer.cpp`**: **词法分析器**。负责获取 Token。 * **`src/parser.cpp`**: **语法分析器**。定义了所有的文法规则(`loadGrammar` 函数)。 * **`src/nfa_to_dfa.cpp`**: 自动机算法库。这是底层的工具,负责让词法分析器跑起来。 * **`include/`**: 头文件目录,定义了 Token 结构和各种类的声明。 ## 4.中间代码生成部分 1. 重点看 `src/parser.cpp`。 2. 找到 `parse` 函数里的 `else if(action.substr(0, 1) == "r")` 分支。 3. 这里是发生**归约 (Reduction)** 的地方。 4. 需要在这里判断当前归约的是哪个产生式(比如 `AddExp -> AddExp + MulExp`),然后执行相应的语义动作(比如生成 `t1 = a + b`)。 如果有编译报错,记得先运行 `mingw32-make clean` 清理一下再重新编译。