这是我的编译原理课程的个人仓库,包含每一个实验Lab的全部代码以及最后的实验报告。
在本实验中,探究了语言处理系统的工作流程和机制,围绕以下几个方面展开:
- 预处理器做了什么
- 编译器做了什么
- 汇编器做了什么
- 链接器做了什么
- 编写了
LLVM IR
小程序实例,实现了SysY编译器支持的部分语言特性
具体可参考实验文档 了解编译器实验报告
本次实验共有两个工作要完成:
工作一:(两人合作完成)
- 设计SysY编译器的上下文无关语法
- 设计SysY程序,并给出等价的ARM汇编程序代码
工作二:(单人完成)
- 实现表达式计算的词法分析Yacc程序
- 实现将中缀表达式转化为后缀表达式的Yacc程序
本次实验为实现lex工具实现词法分析器,主要包含的功能如下:
- 识别所有的单词, 将源程序转化为单词流;
- 设计符号表, 需要考虑符号表的数据结构, 搜索算法, 词素的保存, 保留字的处理等问题. 常数的属性可以是数值, 标识符是指向符号表的指针;
课外探索的部分:
- 设计实现正则表达式到NFA的转化;
- 设计实现NFA到DFA的转化;
- 设计实习DFA的化简;
- 实现模拟DFA的运转的程序;
本次实验为使用yacc工具根据SysY语言文法生成语法分析部分, 主要包含的功能如下:
- 语法树数据结构的设计:结点类型的设计,不同类型的节点应保存的信息。
- 扩展上下文无关文法,设计翻译模式。
- 设计 Yacc 程序,实现能构造语法树的分析器。
- 以文本方式输出语法树结构,验证语法分析器实现的正确性。
我们需要在之前构造好的语法树的基础上,进行类型检查,检测出代码中的一些错误并进行错误信息的打印,之后需要进行中间代码的生成,在中间代码的基础上,就可以进行一系列代码的优化工作。
- 在语法分析实验的基础上,遍历语法树,进行简单的类型检查,对于语法错误的情况简单打印出提示信息。
- 完成中间代码生成工作,输出中间代码。
在中间代码生成之后,就可以对中间代码进行自顶向下的遍历,从而生成目标代码。需要以下几个方便的设计:
- 需要完成指令的翻译工作;
- 实现寄存器分配算法:包含活跃区间分析,寄存器分配,生成溢出代码;
更进一步地实现中间代码层的优化:常量折叠,mem2reg算法,公共子表达式消除等优化算法