FOR循环语句的翻译程序设计简单优先法输出四元式.docx
《FOR循环语句的翻译程序设计简单优先法输出四元式.docx》由会员分享,可在线阅读,更多相关《FOR循环语句的翻译程序设计简单优先法输出四元式.docx(15页珍藏版)》请在冰豆网上搜索。
FOR循环语句的翻译程序设计简单优先法输出四元式
学号:
0120810340631
课程设计
题目
FOR循环语句的翻译程序设计(简单优先法、输出四元式)
学院
计算机科学与技术
专业
计算机科学与技术
班级
0806
姓名
张军
指导教师
郭羽成
2011
年
1
月
7
日
课程设计任务书
学生姓名:
张军专业班级:
计算机0806班
指导教师:
郭羽成工作单位:
计算机科学与技术学院
题目:
FOR循环语句的翻译程序设计(简单优先法、输出四元式)
初始条件:
理论:
学完编译课程,掌握一种计算机高级语言的使用。
实践:
计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:
1系统描述(问题域描述);
2文法及属性文法的描述;
3语法分析方法描述及语法分析表设计;
4按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5编译系统的概要设计;
6详细的算法描述(流程图或伪代码);
7软件的测试方法和测试结果;
8研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);
9参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试及测试。
周5:
撰写课程设计报告。
设计验收安排:
设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:
设计周的次周星期一上午10点。
指导教师签名:
2011年1月7日
系主任(或责任教师)签名:
2011年1月7日
FOR循环语句的翻译程序设计(简单优先法、输出四元式)
1系统描述(问题域描述)
1.1设计目的
通过学习编译原理的相关内容,设计并编写FOR循环语句的翻译程序,使用简单优先法,按四元式输出,能够实现词法分析,语法和语义的分析,加深对所学知识的理解,并且能够熟练运用到实际当中。
1.2设计内容描述
FOR循环语句的基本格式如下:
FOR(表达式1;表达式2;表达式3)
根据所给题目要求,设计出符合FOR循环语句的文法及属性文法的描述,语法分析方法以及四元式的输出方式,罗列出词法分析和语法分析的流程,根据语法规则设计输入输出方法,简单优先法中的优先关系表格。
设计好并且进行编译,设计若干输入输出用例(包括正确的输入和错误的输入,用来检查程序的完整性),例如:
For(i=0;i<50;i++){m=m+j;}//正确输入
For(i=0;i<60i++){}//错误输入
对于错误的输入,最好设计成能够报错输入位置。
2.文法及属性文法的描述
由For语句的特点,制定的产生式规则如下(COUNT表示常数,ID表示标识符):
S=>(A;B;C){H;}│(A;D;E){H;}
A=>ID=COUNT
B=>IDC=>ID++
D=>ID>COUNT
E=>ID--
H=>ID1=ID2+ID3│ID1=ID2+COUNT│ID1=COUNT+ID2
由产生式对应的语义动作:
S=>(A;B;C){H;}│(A;D;E){H;}GOTO;
A=>ID=COUNTID.CODE=COUNT.CODE;
B=>ID=COUNT.CODE
GOTOOVER;
C=>ID++ID.CODE=ID.CODE+1;
D=>ID>COUNTIFID.CODE<=COUNT.CODE
GOTOOVER;
E=>ID--ID.CODE=ID.CODE-1;
H=>ID1=ID2+ID3│ID1=ID2+COUNTID1.CODE=ID2.CODE+ID3.CODEOR
│ID1=COUNT+ID2ID1.CODE=ID2.CODE+COUNTOR
ID1.CODE=COUNT+ID2.CODE
3语法分析方法描述及语法分析表设计
3.1语法分析方法描述
本次课程设计要求使用简单优先关系方法。
简单优先分析法的基本思想史对一个文法按照一定原则求出该文法所有符号即包括终结符和非终结符之间的优先关系确定归约过程中的句柄,它的归约实际上是一种规范归约。
一个文法是简单优先文法必须满足以下条件
(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立;
(2)在文法中任意两个产生式没有相同的右部。
三种优先关系及其判定方法如下所示:
(1)X=Y表示X和Y的优先关系相等,当且仅当G中存在产生式规则A→…XY…;
(2)XA→…XB…,且B
Y…;
(3)X>Y表示X的优先性比Y的优先性大,当且仅当G中存在产生式规则
A→…BD…,且B
…X和D
Y…;
(4)对任何X,若文法开始符号S→X…,则##。
3.2分析法操作步骤
由简单优先分析法的基本思想设计的如下算法,首先要构造优先关系矩阵(如3.3所示),并将文法产生式保存,设置符号栈S:
(1)将输入符号串a1a2…an#依次逐个保存符号栈S中,直到遇到栈顶符号ai的优先性>下一个待输入符号aj为止。
(2)栈顶当前符号ai为句柄尾,由此向左在栈中找句柄的头符号ak,即找到ak-1(3)由句柄ak…ai在文法的产生式中查找右部为ak…ai的产生式,若找到则用相应左部代替句柄,找不到则为出错,这是可断定输入串不是该文法的句子。
(4)重复
(1)
(2)(3),直到归约完输入符号串,栈中只剩文法的开始符号为止。
3.3优先关系矩阵
123456789101112131415161718192021
S
E
F
G
H
X
Y
f
(
)
{
}
=
c
<
>
+
–
;
i
#
S
1
E
0
F
0
G
0
H
0
X
0
Y
0
f
0
(
0
-1
)
0
{
0
-1
}
1
=
0
0
c
0
1
<
0
>
0
+
1
0
0
0
–
1
0
;
0
0
0
0
0
-1
i
0
0
0
0
0
1
#
-1
-1
0
S
E
F
G
H
X
Y
f
(
)
{
}
=
c
<
>
+
–
;
i
#
其中,0表示列中的符号优先级=行中的符号优先级;1表示列中的符号优先级>行中的符号优先级;-1表示列中的符号优先级<行中的符号优先级;空白表示,没有优先级关系,即在语法规则中符号没有相邻关系,在程序中用返回值-2表示。
4中间代码形式的描述及中间代码序列的结构设计
四元式是一种比较普遍采用的中间代码形式
四元式的四个组成成分是:
算符OP。
、,第一和第二运算对象ARG1和ARG2及运算结果RESULT。
运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。
对于本程序的具体四元式输出,预计显示结果如下:
给定输入程序For(i=0;i<50;i++){m=m+j;}
四元式输出为
IDOPARG1ARG2RESULT
(1)=0-i
(2)ifi>=50gotoover
(3)+mjT
(4)=T-m
(5)+i1i
(6)goto
(2)
(7)over
5编译系统的概要设计
主要函数及对应实现的功能如下表所示:
函数名称
实现功能
Main()
程序入口
getline()
接受输入程序保存在string中
Recstr()
词法分析,分离符号
Getchar()
对输入流中的符号进行分析
Identify()
辨别普通标识符和关键字
Gramcheck()
语法分析
Compare()
比较优先关系
词法分析以输入的字符串为基础进行判断,如果输入合法则将各个字符进行分类显示;
语法分析以词法分析的结果作为依据,验证输入流中的各种符号是否符合规则。
6详细的算法描述(流程图或伪代码)
6.1main()的实现
intmain()
{
…//输出语法规则
…
inti=0;
strings;
…
getline(cin,s);//将输入保存到S中
…
Recstr(s,i);//词法分析
node[nodeSize].type=21;nodeSize++;
symStack.push(21);
…
…
gramCheck();//语法分析
return0;
}
6.2词法分析过程
词法分析过程是个相对独立的过程,将输入的字符串定义到一个结构体数组当中,对数组中的字符或者单词进行判定和分类,包含的类型有关键字,变量,界符,运算符,数字,并且在此部分将各个涉及到的字符进行标号,从1到21。
结构体structsymNode保存词法分析后的单词信息;数组symNodenode[]用来保存词法分析结果作为语法分析的输入;voidRecstr()是词法分析主体部分;voidgetChar()用来取字符串;voidIdentify()判断区分是关键字(for)还是普通标识符。
词法分析的流程图:
Y
N
Y
N
Y
N
Y
N
词法分析的输出方式以二元方式输出,形式为(字符,所属类型)
6.3语法分析
语法分析当中设计的实现过程:
Compare()//读入优先关系矩阵,用来做语法分析,比较符号栈的首部和输入
流的首部,大于返回1,小于返回-1,等于返回0,无关返回-2
gramCheck()//词法分析:
⑴如果栈中符号是开始符,输入流只剩下#,则分析
成功
⑵比较优先关系:
①返回值为-1,符号入栈,并且输入流当前位置+1
②返回值为0,符号入栈,并且输入流当前位置+1
③返回值为1,栈中符号向左寻找句柄,根据句
柄寻找产生式,找到则将产生式左部符号入栈,
根据语义规则生成产生式
语法分析流程如下:
Y
N
Y
N
Y
N
N
Y
6.4四元式的输出
在程序输入为正确输入的前提下,四元表达式为7个,根据语法分析产生中间代码,设计输出的格式比较固定,下面给出代码片段作为介绍:
if(tempStack.size()==12)//输出第567行
{
symStack.push
(1);
if(iAOD==17)
cout<<"(5)(+,"<elseif(iAOD==18)
cout<<"(5)(-,"<cout<<"(6)goto
(2)"<cout<<"(7)over:
"<}
elseif(tempStack.size()==5)//输出34行
{
symStack.push(5);
cout<<"(3)(+,";
if(node[position-3].type==20)
cout<elseif(node[position-3].type==14)
cout<if(node[position-1].type==20)
cout<elseif(node[position-1].type==14)
cout<cout<<"(4)(=,T,-,"<}
Else//输出12行
{
…
}
7测试方法和测试结果
计算机系统:
WindowsXPSP3
编译调试环境:
VisualC++6.0
程序语言:
c++
设计测试用例:
(1)正确的程序输入:
For(i=0;i<50;i++){m=m+j;}
输入程序段
显示词法分析结果:
显示中间代码四元式:
正确用例:
for(i=0;i>50;i--){m=m+20;}
程序输入及词法分析结果略;
四元表达式如下:
(2)错误的程序输入:
For(i=0;i<60;i++){m=m+i}
程序输入以及词法分析略
生成四元式如下:
结果分析:
正确输入程序段后,能够进行词法分析,并且准确输出四元表达式,词法分析结果与实际相符合,四元式与预期结果一致,程序成功运行。
输入错误程序段后,能够进行词法分析,词法分析结果与实际相符合,但是由于是错误程序段,则不能顺利输出所有四元式,只能根据简单优先法分析到哪里输出到哪里,如上所示,只能成功分析出2行。
程序出错会报出错位,上例中程序段最后缺少“;”,因此报错位为21.
程序不足:
由于个人能力有限,产生式规则定义的比较简单,不是很全面,比如只能进行“i++”
或者“i--”之类的运算而没能实现“++i”或者“--i”等的运算,执行部分也只定义了一个算式,无法进行2个或2个以上算式的运行,这些都有待改进。
8研制报告
研制过程:
经过了一学期的编译原理的学习,对编译原理的基本方法有了初步了解。
结合相关书籍以及互联网上的资料,实现了本次程序的研制。
在确定了所要设计的For语句属性文法之后,把程序整体划分为主要的2个部分:
词法分析部分和语法分析部分。
而后对这两个部分进行了进一步的分析:
词法分析主要针对输入的字符进行判别的分类,将分类结果显示出来,该结果将直接作为语法分析的主要依据;语法分析使用的是简单优先法,此种方法需要制定出优先关系矩阵,根据程序所需,将涉及到的21个字符进行编号1-21,依次逐个比较优先关系,制定出优先关系矩阵。
绘制出流程图之后,根据流程进行程序的编写会变得简单很多,之后进行的就是编译调试和改写工作。
自我感受:
课程设计历时4天,在这4天里很忙,课程设计也是在考试过后的空闲时间编写完成的,因此看起来会比较粗糙,这个是时间上安排出的问题,同时也暴露出了个人能力需要很大提高的这个缺陷。
在今后的学习中,我会多多向他人学习,多借鉴他人优秀的编程方法和思想,并且多做练习,达到学以致用。
有时间我会把这个程序做的更加完美的。
9参考文献
【1】张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第二版).清华大学出版社.2006年10月
【2】算数表达式的翻译(简单优先法,输出四元式),搜狐博客
【3】王雷等.编译原理课程设计.机械工业出版社.2005年3月
本科生课程设计成绩评定表
班级:
计科0806 姓名:
张军 学号:
0120810340631
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
2011年 1月 日