目录
一、 任务目标 1
二、 开发环境 1
三、 程序功能描述 1
四、 程序实现过程 1
五、 执行界面与运行结果 5
六、 问题和解决的方法、心得体会 12
一、任务目标
1、掌握使用高级程序语言实现一个一遍完成的、简单语言的编译器的方法。
2、掌握简单的词法分析器、语法分析器、符号表管理、中间代码生成以及目标代码生成的实现方法。
3、掌握将生成代码写入文件的技术。
二、开发环境
编程语言:Python 2.7、C# 7.0
使用工具: Visual Studio 2017、Pycharm 2018
操作系统:Windows 10,版本17134
运行环境:.Net Framework 4.6.1
三、程序功能描述
实现了C- -语言的词法分析、对所用文法LR(1)分析表的建立、语法分析、语义分析(包括语义栈、符号表、函数表、中间代码生成以及写入文件,方法为一遍扫描)、MIPS汇编生成及写入文件。
支持源代码保存、文法产生式显示、LR(1)分析表显示、分析过程展示、中间代码及MIPS汇编展示。
四、程序实现过程
1、主要算法与模块
①词法分析:
正则表达式匹配算法:
我借鉴了工具lex的词法分析算法,以正则表达式匹配的方法代替DFA进行词法分析,通过6个正则表达式并行匹配词法元素,每一次将位于开头的最长匹配序列识别为对应的正则表达式所代表的token,从而实现了词法分析。
②LR(1)语法分析:
求FIRST集算法
由于文法中产生式非终结符的FIRST集存在相互依赖关系,使用递归法会导致计算量的巨大,因此我使用了自下而上求解FIRST集依赖的算法:对于每个产生式左侧非终结符T,若其FIRST依赖于另一非终结符F,则将F加入到其FIRST集中。将所有FIRST集中含有非终结符的非终结符加入到列表Q中,当Q不为空时,对每个元素进行遍历:若其依赖的非终结符不在Q中,则将其替换为它的FIRST集中的终结符,当其FIRST集中依赖的非终结符均被替换后,执行出队操作。达到了自底向上求解依赖关系的效果。