高分编译技术课程设计报告.doc
《高分编译技术课程设计报告.doc》由会员分享,可在线阅读,更多相关《高分编译技术课程设计报告.doc(38页珍藏版)》请在冰豆网上搜索。
编译技术课程设计报告
华中科技大学软件学院
《编译技术》
课程设计报告
实验名称C/C++语言编译器设计
姓名
学号
班级
指导教师
2010年11月22日
编译技术课程设计报告
一、实验题目
实验概述:
用C语言对下述文法和单词表定义的语言设计编制一个编译器。
具体要求:
1)单词符号及种别表
单词符号
种别编码
单词值
main
1
int
2
float
3
double
4
char
5
if
6
else
7
do
8
while
9
l(l|d)*
10
内部字符串
(+|-|ε)d*(.dd*|ε)(e(+|-|ε)dd*|ε)
20
二进制数值表示
=
21
+
22
-
23
*
24
/
25
(
26
)
27
{
28
}
29
30
;
31
>
32
>=
33
<
34
<=
35
==
36
!
=
37
单词符号及其种别表
2)语法结构定义
<程序>:
:
=main()<语句块>
<语句块>:
:
=‘{‘<语句串>’}’
<语句串>:
:
=<语句>{;<语句>};
<语句>:
:
=<赋值语句>|<条件语句>|<循环语句>
<赋值语句>:
:
=ID=<表达式>
<条件语句>:
:
=if<条件><语句块>[else<语句块>]
<循环语句>:
:
=do<语句块>while<条件>
<条件>:
:
=<表达式><关系运算符><表达式>
<表达式>:
:
=<项>{+<项>|-<项>}
<项>:
:
=<因子>{*<因子>|/<因子>}
<因子>:
:
=ID|num|(<表达式>)
num:
:
=(+|-|ε)数字*(.数字数字*|ε)(e(+|-|ε)数字数字*|ε)
ID:
:
=字母(字母|d数字)*
字母:
:
=a|b|c…|z|A|B|C…|Z
数字:
:
=0|1|2…|9
<关系运算符>:
:
=<|<=|>|>=|==|!
=
二、实验目的
1)通过该课程设计,熟练应用编译原理的基本理论和方法
2)学会用C/C++高级程序设计语言设计一个编译器的技术
3)加深对编译原理的分析理论的理解,培养动手实践能力
4)通过设计、编制、调试一个编译器,掌握其设计方法和技术,提高解决实际问题的综合素质
三、实验要求
处理用户提交的符合上述文法的源代码序列,生成四元式中间代码或X86平台上的目标代码。
四、实验步骤
1)画出识别上述语言单词的状态转换图
2)用C/C++语言编写词法分析程序(应考虑能被语法分析程序调用)
3)预处理,去除注释、多余空格、回车换行符等
4)设计实现语法分析程序(调用上述词法程序分析单词)
5)设计构造属性文法及中间代码序列结构
6)采用语法制导翻译法,完成语义分析程序设计,生成四元式中间代码
7)或将生成的四元式中间代码转换成X86平台上的目标代码
8)设计若干用例,上机测试并通过所设计实现的编译器
五、实验方案设计实现
1.总体设计思想
本课设的任务是完成一个完整的编译器,处理用户提交的符合所定文法的源程序代码,生成四元式中间代码,进而翻译成等价的X86平台上汇编语言的目标程序。
编译程序的工作过程划分为下列5个过程:
词法分析,语法分析,语义分析和中间代码生成,代码优化,目标代码生成。
其中,词法分析阶段的基本任务是从以字符串表示的源程序中识别出具有独立意义的单词符号,并以二元组的形式输出,以作为语法分析阶段的输入。
语法分析阶段的基本任务是将词法分析阶段产生的二元组作为输入,根据语言的语法规则,识别出各种语法成分,并判断该单词符号序列是否是该语言的一个句子。
语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式(本课设采用四元式)来描述这种语义。
代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效即省时间和空间的目标代码。
目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码(本课设生成汇编指令代码)。
在词法分析阶段,通过DOS环境手动输入字符串序列(以’#’作为结束标志)作为带分析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(若有不属于该语言单词符号出现,则进行出错处理),词法扫描子程序包括了对源程序的预处理(忽略多余空格、回车换行符等空白字符),以及对单词的识别和分类,以形成(单词种别,单词自身的值)形式的二元组,并将用户自定义变量信息存入程序变量信息表。
在语法分析阶段,采用自上而下的递归下降分析法,从文法的开始符号出发,根据文法规则正向推导出给定句子。
根据递归下降分析函数编写规则来编写相应的函数,在各个函数的分析过程中调用词法分析程序中的扫描程序,发出“取下一个单词符号”的命令,以取得下一个单词符号作语法分析。
在语义分析和中间代码生成阶段,采用语法制导翻译法,使用属性文法为工具来描述程序设计语言的语义。
首先审查词法分析得到的每个语法结构的静态语义,如果静态语义正确再生成中间代码(本课设中采用四元式)。
使用属性文法作为描述程序设计语言语义的工具,采用语法制导翻译法完成对语法成分的翻译工作,即在语法分析过程中,依随分析的过程,根据每个产生式所对应的语义子程序(或语义规则描述的语义处理的加工动作)进行翻译。
目标代码生成是编译程序的最后一个阶段,根据符号表等信息,将中间代码转化为等价的目标代码。
为减少访问计算机内存的次数,应尽可能把基本块内还要被引用的变量放到寄存器中,而把基本块内不用的变量所占的寄存器释放。
为了随时掌握寄存器的使用情况和变量的存放情况,以便生成适当地目标代码,可以建立寄存器描述表和变量地址描述表。
在编译程序的各个阶段中都要涉及到表格管理和错误处理。
编译程序在工作过程中需要建立一些表格,以登记源程序中所提供的或在编译过程中所产生的一些信息,编译各个阶段的工作都涉及到构造、查找、修改或存取有关表格中的信息(本课设中建立了程序变量信息表,变量地址描述表,寄存器描述表)。
一个好的编译程序在编译过程中,应具有广泛的程序查错能力,并能准确地报告错误的种类及出错位置,以便用户查找和纠正,因此,在编译程序中还必须有一个出错处理程序。
实验的整体设计思想可由以下图示表示:
编译器基本模块设计
2.详细算法设计(包括分析表设计)
a)词法分析器
词法分析的任务是对字符串表示的源程序从左到右地进行扫描和分解,根据语言的词法规则识别出一个一个具有独立意义的单词符号,包括关键字,标识符,常数,运算符,分界符。
词法分析程序所输出的单词符号表示成如下的二元式:
(单词种别整数码,单词自身的值)
其中,基本字、运算符和界符都是一符一种,标识符自身的值用自身的字符串表示,
常数自身的值用常数本身的值表示;
构造出识别语言单词符号的有穷自动机,根据单词符号的状态转换图就可构造出识别语言单词符号的词法分析程序。
⑴词法分析程序中涉及的两个正规式:
l(l|d)*
(+|-|ε)dd*(.dd*|ε)(e(+|-|ε)dd*|ε)
⑵词法分析程序状态转换图:
l|d
非l
非d
其他
=
!
311
29
301
;
,
}
{
281
271
261
251
)
(
\
*
241
23
221
211
非=
=
<
201
191
18
非=
=
>
非=
=
=
161
171
15
141
131
12
d
d
-
+
e
e
d
d
.
d
d
-
+
10
111
9
8
7
6
5
4
3
2
l
1
0
b)语法分析器(递归下降法)
采用自上而下的递归下降分析法,从文法的开始符号出发,根据文法规则正向推导出给定句子。
对文法中的每个非终结符编写一个函数(或子程序),每个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。
描述语言的文法常常是递归定义的,因此相应的这组函数(或子程序)必然以相互递归的方式进行调用。
为每个非终结符编制一个递归下降分析函数,每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构和顺序编写,完成相应非终结符匹配,通过所有子程序的相互调用,完成整个终结符号串的分析。
(1)当遇到终结符a时,则编写语句
if(当前读来的输入符号==a)读下一个输入符号;
(2)当遇到非终结符A时,则编写语句调用A();
(3)当遇到规则A→ε时,则编写语句
if(当前读来的输入符号FOLLOW(A))
error();
递归下降分析法是确定的自上而下分析法,这种分析法要求文法是LL
(1)文法。
语法结构定义采用扩充的BNF表示法,避免了直接左递归规则,并且也没有公共左因子。
对于非终结符E→T{+T},函数T()用while语句描述如下:
T()
{
F();
while(sym==‘*’)
{
Scanner();
F();
}
}
c)语义分析和中间代码生成器(语法制导翻译法)
1语义分析的任务:
1)静态语义审查:
审查每个语法结构的静态语义,即验证语法结构合法的程序,是否真正有意义。
2)执行真正的翻译:
如果静态语义正确,语义处理则要执行真正的翻译,即生成程序的某种中间代码的形式或直接生成目标代码。
2语法制导翻译法的基本思想
为文法的每个产生式都配备一个语义动作或语义子程序。
在语法分析的过程中,每当使用一条产生式进行推导或归约时,就执行相应产生式的语义动作,从而实现语义处理。
在语法分析过程中,依随分析的过程,根据每个产生式所对应的语义子程序(或语义规则描述的语义处理的加工动作)进行翻译。
3属性文法和语义规则
语法制导翻译法使用属性文法为工具来描述程序设计语言的语义。
属性文法包含一个上下文无关文法和一系列语义规则(为文法的每一个规则配备的计算属性的计算规则)。
这些语义规则附在文法的每个产生式上,在语法分析过程中,执行语义规则描述的动作,从而实现语义处理。
也就是说,附在文法的每个产生式上语义规则描述了语义处理的加工动作。
4四元式中间代码结构
四元式主要由四部分组成:
(OP,arg1,arg2,result)
其中OP是运算符;arg1,arg2分别是第一和第二两个运算对象(当OP是一目运算时,常常将运算对象定义为arg1);result是编译程序为存放中间运算结果而临时引进的变量,常称为临时变量,如Ti,也可以是用