学 号:
0121210340314
课内实践报告
课程名称
编译原理
设计
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目
WHILE循环语句的翻译程序设计(递归下降法,输出四元式)
学院
计算机科学与技术
专业班级
计算机1203班
姓名
闵丹枫
指导教师
林泓
2014
年
12
月
8
日
课程设计任务书
学生姓名: 闵丹枫 专业班级: 计算机1203班
指导教师: 林 泓 工作单位:计算机科学与技术学院
题目: WHILE循环语句的翻译程序设计(递归下降法、输出四元式)
初始条件:
理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1) 写出符合给定的语法分析
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
的文法及属性文法。
(2) 完成题目要求的中间代码四元式的描述。
(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:
1 系统描述(问题域描述);
2 文法及属性文法的描述;
3 语法分析方法描述及语法分析表设计;
4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5 编译系统的概要设计;
6 详细的算法描述(流程图或伪代码);
7 软件的测试方法和测试结果;
8 研制报告(研制过程,本设计的
评价
LEC评价法下载LEC评价法下载评价量规免费下载学院评价表文档下载学院评价表文档下载
、特点、不足、收获与体会等);
9 参考文献(按公开发表的
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
书写)。
时间安排:
设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2014年 9月 1日
系主任(或责任教师)签名: 2014年 月 日
WHILE循环语句的翻译程序设计(递归下降法、输出四元式)
一. 系统描述
1.1问题描述
设计一个WHILE〈布尔表达式〉DO〈赋值语句〉循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。
1.2主要任务
设计一个能识别WHILE循环语句的文法,消除左递归,使文法符合LL(1)文法。利用递归下降法编写一个集词法分析,语法分析和语义分析为一体的程序。该程序首先可以检查输入语句是否符合词法要求,若符合则继续识别输入的语句是否符合while语句的文法,若符合则进行语义分析,输出用四地址代码表示的中间代码。
二. 文法及属性文法的描述
2.1 文法的描述
扩充巴科斯-瑙尔范式(EBNF):
::= while (<条件语句>) do{ <赋值语句> }
<条件语句> ::= <表达式><条件运算符><表达式>
<表达式> ::= <表达式> + <表达式2> | <表达式> - <表达式2> | <表达式2>
<表达式2>::=<表达式2> * <表达式3> |<表达式2> / <表达式3> | <表达式3>
<表达式3>::=(<表达式>) | <标识符>|<数字>
<赋值语句>::=<标识符>=<表达式>;
根据以上写出来的WHILE循环语句的文法表示如下:
1.S -> while (A) do {B}
2.A -> CDC
3.D ->> | = | < | >= |<=
4.C -> C+E | C-E | E
5.E -> E*F | E/F | E
6.F -> (C) | i | n
对以上文法消除左递归,最后得到的文法为:
1.S->while (A) do {B}
2.A->CDC
3.D->> | = | < | >= | <=
4.C->EG
5.G->+EG | -EG | ε
6.E->FH
7.H->*FH | / FH | ε
8.F->(C) | i | n
9.B->i=C;
2.1属性文法的描述
(1)任一非终结符B都不是左递归的,否则会产生死循环。
(2)对A的任意两个右部βi , βj ,有:first(βi)∩first(βj)=φ, First(βi)表βi所能导出串的第一个符号的集合。显然,每个βi的first(βi)是互不相同的,否则则无法判断应执行哪个ζ(βi )。
产生式
语义规则
S-->while (A) do {B}
{S.first:=newtemp;
S.second:=newtemp;
A.true:=newtemp;
emit(A.false:=S.second;
S1.second:=S.first;
S.place:=(S.begin, ‘:’) || B.place ||printf(S.true, ‘:’) ||S1.place || printf(‘goto’,S.begin) || printf(B.false, ‘:’) || printf(‘gotoLnext’);)}
A-->CDC
{A.place:=newpemt;
emit(A.place':='C1.place D.place C2.place)}
.D-->>
{D.place:=newtemp ;
Emit(D.Place':=''>')}
.D--><
{D.place:=newtemp ;
Emit(D.Place':=''<')}
.D--> =
{D.place:=newtemp ;
Emit(D.Place':=''=')}
.D-->>=
{D.place:=newtemp ;
Emit(D.Place':=''>=')}
.D--><=
{D.place:=newtemp ;
Emit(D.Place':=''<=')}
C-->EG
{C.Place:=newtemp;
Emit(C.Place':='E.PlaceG.place)}
G->+EG
{G.Place:=newtemp;
Emit(G1.Place':=''+'E.Place G2.place)}
G->-EG
{G.Place:=newtemp;
Emit(G1.Place':=''-'E.Place G2.place)}
G->ε
{G.Place:=newtemp;
Emit(G.Place':='''}
H->*FH
{H.Place:=newtemp;
Emit(H1.Place':=''*'F.Place H2.place)}
H-> /FH
{H.Place:=newtemp;
Emit(H1.Place':=''+'F.Place H2.place)}
H->ε
{G.Place:=newtemp;
Emit(H1.Place':=''+'E.Place H2.place)}
F->(C)
{F.Place:=C.Place}
B->i=C;
{p:=lookup(i.name)
If p!=nil then
Emit(p':='C.Place
Else error)}
三. 语法分析方法描述
3.1语法分析方法描述
递归下降法是一种比较简单直观,易于构造的语法分析方法。他要求文法满足LL(1)文法,他的设计思想是对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的单词(或串),当某非终结符的产生式有多个候选时,能够按LL(1)形式可唯一地确定选择某个候选进行推导。
它的优点是简单直观,易于构造,很多编译系统所实现
缺点是对文法要求很高,由于递归调用多,影响分析器的效率。
递归下降程序是由一组子程序组成,每个子程序对应于一个非终结(S,A,B,C,D,E,F,G,H)。每个子程序处理相应句型中相对于此非终结符号的产生式。在定义文法时,是递归定义的,所以这些子程序也是递归的。当一个子程序调用另一个子程序时,原子程序顺序执行语句,即总是先执行被调用的子程序,然后再执行后继的程序。程序中9个子程序,其中S 是开始符号,也是递归下降分析的入口,通过调用词法分析器进行单词分析,并通过word=l.Yufa_Queue.front()来得到当前所分析到的单词,然后在递归语法分析中根据这个单词分析下一步要执行的子程序。其中要注意的是,当子程序G()和H()中出现匹配的是空字符串时,不做单词处理,该所取得的单词,应该为下一个匹配产生做准备。
3.2递归下降法实现的原理
设A是一个非终结符:A→β1
A→β2
┊
A→βn
则写 ζ(A) if char∈first(β1 ) thenζ(β1 )
else if char∈first(β2 ) then ζ(β2 )
else…
ifchar∈first(βn ) then ζ(βn)
else ERROR
其中ζ(βi)表示调用处理符号串βi的子程序。
对A的任一右部i 设为:βi = y1 y2 … yn
则定义ζ( βi) beginζ(y1);ζ(y2);…;ζ(yn) end
其中yj可分为下列两种情况(j=1,…,n):
1) yj∈VT,则
ζ( yj) if char≠yj then ERROR else READ(char)
2) yj∈VN,则ζ(yj)表示调用关于yj的递归子程序。
四.中间代码形式的描述及中间代码序列的结构设计
4.1四元式形式
中间代码为四元式,按照要求,要输出四元式一个四元式是一个带有四个域的记录结构,这四个域分别称为op﹑arg1﹑arg2及result。域op包含一个代表运算符的内部码。语句while aaFb
if ((temp[sign] >= 'a' && temp[sign] <= 'z') || (temp[sign] > 'A' && temp[sign] <= 'Z')){
cout<< "(" ;
sign++;
Do_F(temp);
}
else{
cout<< "()中含有非法字符!" << | = | > | <= | >=
voidDo_F(string temp){ //F ->< | = | > | <= | >=
intf_sign = sign;
if (temp[f_sign] == '<' || temp[f_sign] == '=' || temp[f_sign] == '>'){
if (temp[f_sign + 1] == '='){
cout<< temp[f_sign + 1]<<",";
if ((temp[f_sign + 2] >= 'a' && temp[f_sign + 2] <= 'z') || (temp[f_sign + 2] > 'A' && temp[f_sign + 2] <= 'Z')){
cout<= 'a' && temp[f_sign + 1] <= 'z') || (temp[f_sign + 1] > 'A' && temp[f_sign + 1] <= 'Z')){
cout< c=R
void Do_G(string temp){ //G-> c=R 赋值表达式
int p[MAX];
intlen = temp.size() + 1;
charch = 'a';
int c = -1, q = 0;
while (temp[sign] != ';' && sign = 'A'&&ch<= 'Z')
{
for (int l = 0; l= 'A'&&str[e] <= 'Z')
{
for (inti = 0; ib){z=x+y;}
测试结果如下:
输入while(a>b){z=x+y*c;} 测试结果如下
输入wh(a>b){z=y;} 结果为:
输入while(a>b){z=z+y} 结果为:
八. 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等)
8.1研制过程
在做本次实验之前我对LL(1)文法的构成,递归下降原理不是很了解,在查阅了相关资料后,对此有了深入了解。将词法分析,语法分析,中间语言翻译结合到一起。
8.2 设计的评价、特点、不足
设计的程序基本上实现了用递归下降分析法实现了while语句的翻译,并能够用四元式将其输出,使人一目了然。程序还能够准确提示词法和语法错误。同时程序运行时简单明了,易于使用。
8.3收获和体会
深入了解计算机语言编译和运行的过程,对编译原理有了深刻的认识,掌握了递归下降法,熟练地使用四元式中间代码,明白了对于编写程序,解题的思路为重要。在编写程序之前,如果没有比较清晰的思路,根本不可能编出好的程序。就算马马虎虎的编出来,程序的逻辑性、健壮性、完善性、合理性也不会很强。在编程之前,我们应反复研究题目要求,对题目涉及的情况进行比较充分的分析,以便编写出更加符合题意的程序;其次要充分考虑各种临界情况,对一些错误的输入进行处理。因此在我们编程序之前一定要做好充分的准备,首先要理清自己的思路,然后再将思路分划成几个模块,逐块的写好算法,最后再将所有的模块有机的联系起来,组成一个完整的程序。在成功通过编译的情况下,对程序运行的结果进行系统的分析,检验其正确性,如果有错误,应立即去分析源程序的逻辑错误,直到得到正确的结果。
九. 参考文献
《编译原理第2版》 清华大学出版社 张素琴等著
本科生课程设计成绩评定表
班级:计算机1203姓名:闵丹枫 学号:0121210340314
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
201年 月 日