WHILE循环语句的翻译程序设计LR方法输出四元式Word文档格式.docx
- 文档编号:16819133
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:21
- 大小:273.55KB
WHILE循环语句的翻译程序设计LR方法输出四元式Word文档格式.docx
《WHILE循环语句的翻译程序设计LR方法输出四元式Word文档格式.docx》由会员分享,可在线阅读,更多相关《WHILE循环语句的翻译程序设计LR方法输出四元式Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
3语法分析方法描述及语法分析表设计;
4按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5编译系统的概要设计;
6详细的算法描述(流程图或伪代码);
7软件的测试方法和测试结果;
8研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);
9参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试及测试。
周5:
撰写课程设计报告。
设计验收安排:
设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:
设计周的次周星期一上午10点。
指导教师签名:
2011年12月23日
系主任(或责任教师)签名:
1、系统描述
通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。
用语法制导完成语义分析,并将形成的中间代码以四元式的形式输出。
2、文法及属性文法的描述
2.1文法的描述
该文法的产生式如下所示:
(1)S->
while(B){E}
(2)E->
AE
(3)E->
A
(4)A->
iPA
(5)A->
i
(6)B->
iTi
(7)B->
其中while、(、)、{、}、P、T、;
和i均为终结符,而S、A、B、E这些大写字母均为非终结符。
T表示比较运算符,P表示算术运算符,i表示合法标识符。
2.2属性文法的描述
对该文法的属性文法描述如下:
(1)S->
while(B){E}prinf(ifBgotoEelsegotonext)
(2)E->
AEprint(E.val=A.val·
E.val)
(3)E->
Aprint(E.val=A.val)
(4)A->
iPAprint(A=i.ValPA.Val)
(5)A->
i;
A.Val=i;
(6)B->
iTiprint(B=i1.ValTi2.Val)
(7)B->
iB.Val=i
3、语法分析方法描述及语法分析表设计
3.1语法分析表设计
3.1.1文法的DFA
I0:
S’->
·
S
S->
W(B){E}
3.1.2LR(0)分析表
状态
ACTION
GOTO
while
(
)
{
}
op
rop
;
#
E
B
S2
1
Z
2
S3
3
S5
4
S6
5
r7
S7
6
S9
7
S8
8
r6
9
S14
11
10
r3
13
S12
12
r1
r2
14
S15
S17
15
16
r4
17
r5
3.1.2LR(0)分析方法描述说明
LR分析法的规约过程是规范推到的逆过程,所以LR分析过程是一种规范规约的过程。
其分析过程为:
由文法构造出该文法项目集,再根据项目集构造该文法的DFA,再判断是否有移进-规约和规约-规约冲突,若没有冲突则该文法为LR(0)的,若有冲突则该文法是SLR
(1)的,最后可以构造出LR(0)分析表。
然后根据LR(0)分析表进行语法分析,分析过程就是进栈和规约的过程。
若能规约出开始符S,则语法正确。
反之,语法错误。
4、中间代码形式的描述及中间代码序列的结构设计
本系统中所采用的中间代码形式是四元式,是一种比较普遍采用的形式。
四元式的四个组成成分是:
算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT。
运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。
例如a:
=b*c+b*d的四元式表示如下:
1)(*,b,c,t1)
2)(*,b,d,t2)
3)(+,t1,t2,t3)
4)(:
=,t3,-,a)
四元式对中间结果的引用必须通过给定的名字,也就是说,四元式的联系是通过临时变量实现的。
将while(BropC)gotoL写成(jrop,B,C,L)
本程序中所用到的四元式语句如下:
1)形如(op,arg1,arg2,result)的赋值语句
2)形如(jrop,B,C,L)的条件转移语句
3)形如(=,arg1,-,result)的复写语句
5、编译系统的概要设计
5.1词法分析
词法分析程序要做的工作是:
从源程序的第一个字符开始,顺序读字符,一次读一个,
根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。
词法分析检查的错误
主要是挑出源程序中出现的非法符号。
所谓非法符号是指不是程序设计语言中允许出现的
符号,就像自然语句中的错字。
流程图如下:
5.2语法分析
语法分析是编译过程的核心部分。
它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。
输入串
…
ci
c1
Sp→
┋
X[i]
S[i]
总控程序
输出
ACTION表
GOTO表
栈
结束
其中SP为栈顶指针,S[i]为状态栈,X[i]为文法符号栈。
状态转换表内容按关系GOTO[Si,X]=Sj确定,改关系式是指当前栈顶状态为Si遇到当前文法符号为X时应转向状态Sj。
X为终结符或非终结符。
ACTION[Si,a]规定了栈顶状态为Sj时遇到输入符号c[i]应该执行的动作。
动作有以下四种可能:
(1)移进:
当Sj=GOTO[Si,a]成立,则把Sj移入到文法符号栈。
其中i,j表示状态号。
(2)规约:
当在栈顶形成句柄为b时,则用b归约为相应的非终结符A,即当文法中有A->
b的产生式,而b的长度为r,则从状态栈和文法符号栈中自栈顶向下去掉r个符号。
并把A移入文法符号栈内,再把满足Sj=GOTO[Si,A]的状态移进状态栈,其中Si为修改指针后的栈顶状态。
(3)接受acc:
当归约到文法符号栈中只剩下文法的开始符号S时,并且输入符号串已结束即当前输入符是‘#’,则为分析成功。
(4)报错:
当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该分发能接受的句子。
5.3语法制导翻译
在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或
语义规则描述的语义动作)进行翻译。
属性文法的每个符号有属性,所以每个符号入栈时,
必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。
由于属性类型不同,属性域存放的内容就要根据属性的类型来定。
有的可能直接存放属性值,也有的存放的是指向属性值的指针。
对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。
对于继承属性,其属性域直接保存其属性值。
继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。
6、详细的算法描述
Main()//主程序算法
open("
save.txt"
);
//打开输入文件
output.txt"
//打开输出文件
Print(G[S]);
//显示文法G[S]
intcheck,over=0;
intm,k;
charchr;
for(m=0;
m<
MAX;
m++)
for(k=0;
k<
buf;
k++)
t[m].name[k]='
\0'
//初始化t[]
initlab();
//初始化LR(0)分析表
get(sym);
//取一个字符
while(sym!
=结束)
{
chr=Getsymbol();
//词法分析
if(chr为空格)continue;
else
{
S[num]=chr;
//保存词法分析结果
num++;
}
}
S[num++]='
#'
print("
Thewhilesentenceis:
"
LR();
//语法分析
if(over==-1||Check!
=1)
print("
Yourinputdoesnottallywiththegrammar!
close(文件);
return-1;
if(Check==1)
Parsingcompleted!
close(文件);
return0;
LR()//语法分析算法
i=0;
intk=0;
status.push(0);
symbol.push('
a=输入串队列队首元素;
b=结束符号;
c=符号栈栈顶元素;
d=状态栈栈顶元素;
s=开始符号;
while(a!
=b&
&
c!
=s)
if(k==0)
k=meet(d,a);
continue;
if(k==1)
k=meet(d,c);
if(k==-1)
出错
break;
if(k==2)
成功
k=0;
while(a==b)//分析结束
if(c==s)
if(meet(d,a)==2)
{
ONE();
//语法正确,输出四元式
成功
break;
}
if(c!
=s&
(meet(d,c)==1||meet(d,c))==0)
if(meet(d,c)==-1)
出错
meet(intc,chars)//进栈规约算法
if(s==错误)return-1;
intm,k=0;
if(规约标志为1)
规约
return1;
//规约成功
else
进栈
}
charGetsymbol()//词法分析算法
if(sym==合法标识符的开头)
inth1=0,h2=0,h3=0;
while(sym==字母/数字/下划线)
保存sym到token[]中;
get(sym);
//取下一字符
判断token[]中的字符串是否为关键字while/rop/op
if(是while)
return'
w'
//返回while给主程序
else
if(是rop)return'
r'
//返回rop给主程序
else
if(是op)return'
o'
//返回op给主程序
else
return'
i'
}//已经取了下一个字符
else
if(sym==数字)
while(sym==数字)
{
}
//数字
if(sym=='
('
保存sym到token[]中;
get(sym);
return'
}
if(sym=='
)'
{
get(sym);
}
else
if(sym=='
='
{
保存sym到token[]中;
get(sym);
return'
}
else
if(sym=='
'
{
get(sym);
return'
}
else
X'
//错误
7软件的测试方法和测试结果
7.1运行正确时的情况如下:
7.2输入串保存在input.txt中:
7.3在控制台输入输入串所在文件名连续按两次回车完成词法、语法分析:
7.4词法分析保存在cifa.txt中:
7.5语法分析保存在yufa.txt中:
7.4四元式形式的中间代码保存在obj.txt中:
7.5当文法分析出错时的情况如下:
当语法分析进行到第20步时由于在分析表中找不到相应的下一个状态,故会出错!
8小结与体会
通过本次的编译原理的课程设计,我进一步认识了LR分析方法,对于大多数用无二义性的上下文无关文法描述的语言都可以用相应的LR分析器进行识别,而且这种方法还具有分析速度快,能准确、即使地指出出错的位置。
但是它有一个很明显的缺点:
对于一个实用的高级语言程序,文法的分析器的构造工作量是相当大的。
本次课程设计,我就仅仅只是用了一个简单的直接文法来构造分析表实现“WHILE循环语句的翻译程序设计”,因此,有许多的不足之处,例如:
改程序只能支持WHILE循环判断中的“>
”和“<
”两种条件,还有就是表达式的部分只支持简单的赋值语句的运算。
此外,在课程设计的过程中我又复习了一些C++编程的知识点,熟悉了一些常用的库函数,例如:
字符函数库<
cctype>
中的isalnum()函数(如果参数是字母数字,即字母或数字,该函数返回true)的运用可以减少我们自定义一些基本函数的麻烦。
conio.h头文件,conio是ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
iomanip.h是I/O流控制头文件,用于格式化的输出。
还熟悉了关于Stack类的函数的运用,剩去了我们自己定义stack函数的麻烦,只需在头文件中加入#include<
stack>
即可。
总结下来,此次课程设计使我获益匪浅,在实践中点点滴滴的提升了自己的逻辑分析和编程以及调试程序的能力。
9参考文献
教材:
[1]张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第二版).清华大学出版社.2005年2月
参考书:
[1]何炎祥.编译原理(第二版).华中科技大学出版社.2005年8月
[2]胡伦骏.编译原理(第2版).电子工业出版社.2005年2月
[3]胡元义等.编译原理实践教程.西安电子科技大学出版社.2002年1月
[4]钱能著,C++程序设计教程,北京:
清华大学出版社,2002.7
本科生课程设计成绩评定表
班级:
计科0909班 姓名:
王世创 学号:
0120910340913
序号
评分项目
满分
实得分
学习态度认真、遵守纪律
设计分析合理性
设计方案正确性、可行性、创造性
20
设计结果正确性
40
设计报告的规范性
设计验收
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
2012年1月 日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WHILE 循环 语句 翻译 程序设计 LR 方法 输出 四元式