东北大学编译原理课程设计 English Version README
- Visual Studio 2022
本项目是一个简单文法的编译器前端的设计与实现,包括以下功能:
- 定义一个简单的程序设计语言文法(包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达式、If语句、While语句等)。
- 词法分析器的设计与实现。
- 语法分析器的设计与实现。
- 中间代码设计与生成器的实现。
- 代码优化的实现。
- 基于Windows API实现的可视化界面。
- 基于多寄存器多内存的虚拟机模拟目标指令运行平台。
PROGRAM program id SUB_PROGRAM.
SUB_PROGRAM VARIABLE COM_SENTENCE
VARIABLE var ID_SEQUENCE :TYPE ;
ID_SEQUENCE id {,id}
TYPE integer | real | char
COM_SENTENCE begin SEN_SEQUENCE {; SEN_SEQUENCE} end
SEN_SEQUENCE EVA_SENTENCE|COND_SENTENCE|LOOP_SENTENCE|COM_SENTENCE
EVA_SENTENCE id PUSH(id):= EXPRESSION ASSI(=) //赋值语句文法
EXPRESSION TERM{w1 TERM GEQ(w1)}
TERM FACTOR{w2 FACTOR GEQ(w2)}
FACTOR id PUSH(id) | cons PUSH(cons) | (EXPRESSION)
//EXPRESSION EXPRESSION + TERM | TERM
//TERM TERM * FACTOR | FACTOR
//FACTOR id | cons | ( EXPRESSION )
COND_SENTENCE if LEXP then SEN_SEQUENCE [else SEN_SEQUENCE] //条件语句
LOOP_SENTENCE while LEXP do SEN_SEQUENCE //循环语句
LEXP EXPRESSION LOP EXPRESSION
LOP < | > | <= | >= | ==
- datastructure.h: 定义数据结构。
- lexanalyse.h: 定义词法分析类。
- objectivecode.h: 定义目标代码生成类。
- parser.h: 定义语法分析类。
- SYNBL.h: 定义符号表类。
- keshe_final.h: 项目头文件。
- main.cpp: 主程序。
- lexanalyse.cpp: 词法分析器实现。
- objectivecode.cpp: 目标代码生成实现。
- parser.cpp: 语法分析实现。
- synbl.cpp: 符号表实现。
- pretreat.cpp: 预处理实现。
- VirtualMachine.cpp: 虚拟机实现。
- keshe_final.sln: 解决方案文件。
- keshe_final.vcxproj: 项目文件。
- keshe_final.vcxproj.filters: 项目过滤器文件。
- keshe_final.ico: 项目图标文件。
- small.ico: 小图标文件。
- grammer.txt: 文法说明。
- test1.txt: 测试文本1。
- test2.txt: 测试文本2。
- targetver.h: 目标版本头文件。
- Resource.h: 资源头文件。
- framework.h: 框架头文件。
- 打开 Visual Studio 2022。
- 加载解决方案文件
ProjectFiles/keshe_final.sln
。 - 编译并运行项目。
我们的实现以 NEUEasyCompiler 作为起点。我们感谢其作者的贡献。
创建者:Léon
参与开发者: Léon,lyh,mzh,hxr,szy
欢迎对本项目进行贡献!😊😊😊
该课设仍然存在一定改进之处,如:
- 不支持字符串、数组、结构体、函数。若您希望在此课设代码上进一步开发,欢迎提交 issue 或 pull request。贡献方式:
- 未来建议使用 CMake 来管理项目,CMake 可以有效简化构建过程,尤其是在文件较多的情况下,可以减少每次修改后的编译时间。
- Fork 本仓库
- 创建一个新的分支 (
git checkout -b feature-branch
) - 提交你的修改 (
git commit -am 'Add new feature'
) - 推送到分支 (
git push origin feature-branch
) - 创建一个新的 Pull Request