文档介绍:目录
1 前言 1
2 报告主体 1
设计目的: 1
: 1
设计符号表 1
设计词法分析器 1
语法分析与中间代码产生器 2
优化器(选做) 2
(选做) 2
测试范例: 2
实现原理 3
符号表的设计 3
词法分析器的设计 4
语法/语义分析 5
算法实现流程图 7
测试数据 17
19
软件运行环境及限制 28
心得体会 29
30
3 结论 30
1 前言
在网络世界中,我们往往对功能强大的程序叹为观止。而这些强大程序的背后是编译这些程序的编译软件,是这些编译软件承托起了这些功能强大的运行程序。我们有不少的同志致其自身于无尽的运行程序上。而只有很少的人搞编译程序。这就是为什么中国的可运行程序满天飞,而编译程序却很少。本课程设计就是在这方面的探索,为你解读编译程序的奥秘。
课程设计题目选择9个题目中的一个,要求根据自己的兴趣和能力,选择一个对自己意义甚大的题目。课程设计基本原理是在实践上,实现我们在课程上学习到的理论知识。通过理论联系实践,更好的掌握课本上的理论知识。
2 报告主体
设计目的:
本次课程设计是作一个集词法分析、语法分析、语义分析和中间代码生成于一体的编译器,它集中了《编译原理》里的几乎所有的思想。不但加深了学生对编译方法的理解,而且能对学生的编程能力起到进一步提高的作用,培养学生的程序设计风格。通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。
:
设计符号表
确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。要考虑能够存储有关名字的信息,并可以高效地完成如下操作:
:根据给定的名字,在符号表中查找其信息。如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针;
:从符号表中删除给定名字的表项。
设计词法分析器
设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:
1. 具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;
2. 能够拼出语言中的各个单词;
3. 将拼出的标识符填入符号表;
4. 返回(种别码, 属性值)。
语法分析与中间代码产生器
要求用LL1 、递归下降、算符优先分析法、SLR分析法等方法之一或若干方法,实现对表达式、各种说明语句、控制语句进行语法分析。
若语法正确,则用语法制导翻译法进行语义翻译:对说明语句,要求将说明的各符号记录到相应符号表中;对可执行语句,应产生出四元式中间代码并填写到三地址码表中;
若语法错误,要求指出出错性质和出错位置(行号)。出错处理应设计成一个出错处理子程序
优化器(选做)
1. 局部优化:设计出划分基本块的算法,在每一个基本块中实现:合并已知量、删除多余运算和删除无用赋值三种局部优化。设计构造基本块的DAG图的算法,以及将DAG图还原实现基本块的优化的算法。
2. 循环优化:只做一重循环优化,完成代码外提,强度削弱和删除归纳变量等三种优化。要求实现while循环和for循环语句的优化。
(选做)
能完成指定寄存器个数的情况下将一中间代码程序段翻译成汇编语言目标代码(汇编指令应包括加、减、乘、除),要求指令条数最少的情况下,尽量使用寄存器,尽量少访问内存,这样才能做到运行效率高。
测试范例:
procedure test;
var b,c,i:integer;
begin
b:=1;
if a>b then
c:=a+b
else
c:=a-b;
for i:=0 to 3 do
begin
c:=i;
end;
end;
实现原理
符号表的设计
class Symbol
{
public WordName name;
public StringBuffer type;
public StringBuffer kind;
public StringBuffer val;
public int addr;
public Symbol()
{ name=new WordName();
type=new StringBuf