-
武汉理工大学《编译原理》课程设计说明书
DO-
WHILE
语句的翻译分析程序设计
———递归下降法、输出四元式
1
问题描述
1.1
问题描述
设计一个
DO-WHILE
p>
循环语句的词法﹑语法及语义分析程序,
语法分析选择递归下降法,
采用用语法制导翻译输出中间代码四元式。
1.2
主要任务
通过设计、编制、调试一个
DO-WHILE
< br>循环语句的语法及语义分析程序,加深对语法及
语义分析原理的理解,并实现词法
分析程序对单词序列的词法检查和分析。
首先写出一个能识别
DO-WHILE
循环语句的文法,
通过消除左递归使它符合
LL(1)
即递归
下降法的要求,然后按照这个文法编写一个集词法分析,语法分析
和语义分析为一体的程序,
该程序首先可以检查输入语句是否符合词法要求,若符合则继
续识别输入的语句是否符合
DO-WHILE
语句的文法,若符
合则进行语义分析,输出用四地址代码表示的中间代码。
1.3
测试数据
编写好源代码后,进行调试,根据程序要求进输入一小段程序,进行词法、语法的分析,
给出分析结果。
2
文法及属性文法的描述
2.1
文法的描述
< br>用扩充巴科斯
-
瑙尔范式(
EB
NF
)给出的
while
循环语句的文
法描述,如下:
<
while
语句
> ::=
do
(<
条件语句
>)
while
{
<
赋值语句
> }
<
条件语句
>
::=
<
表达式
><
条件运算符
>
<
表达式
>
<
条件运算符
>
::= > | < | = | >= | <=
<
表达式
> ::=
<
表达式
> +
<
表达式
2> |
<
表达式
> -
<
表达式
2> |
<
表达式
2>
<
表达式
2>::=<
表达式
p>
2> * <
表达式
3>
|<
表达式
2> /
<
表达式
3> |
<
表达式
3>
<
表达式
3>::=(<
表达式
p>
>) | <
标识符
>|<
数字
>
1
武汉理工大学《编译原理》课程设计说明书
< br><
赋值语句
>::=<
标识符<
/p>
>=<
表达式
>
;
2.2 DO-
while
循环语句文法的描述
产生式为
S-> do E while
A
,为便于语法制导翻译将其改写如下:
文法
G(s)
如下:
S-->DGWE
(意思是
do G while
E
)
G-->c=R
R-->dTe|d
T-->+|-|*|/
E-->aFb
F--> >|==|<
2.3 DO-
WHILE
循环语句的属性文法
产生式
语义规则
S
→
do E while A
:=newlabel;
:=newlabel;
:=;
:=;
:=gen(’:’
‖
E
。
code
‖
p>
gen(’:’)
‖
‖
gen(‘goto’
)
3.
语法分析方法及中间代码形式的
描述
3.1
语法分析方法
2
武汉理工大学《编译原理》课程设计说明书
递
归
下
降
程
序
是<
/p>
由
一
组
子
程
序
组
成
,
每
个
子
程
序
对
应
于
一
个
非
终
结
(S,A,B,C,D,E,F,G
,H)
。每个子程序处理相应句型中相对于此非终结符号的产生式。在定义文法
时,是递归定义的,所以这些子程序也是递归的。当一个子程序调用另一个子程序时,原子程<
/p>
序顺序执行语句,
即总是先执行被调用的子程序,
然后再执行后继的程序。
程序中
9
个子程序,
其中
S
是开始符号,
也是递归下降分析的入口,通过调用词法分析器进行单词分析,并通过
word=_()
来得到当前所分析到的单词,
然后在递归语法分析中根据这个单
词分
析下一步要执行的子程序。其中要注意的是,当子程序
G(
)
和
H()
中出现匹配的是空字符串时
,
不做单词处理,该所取得的单词,应该为下一个匹配产生做准备。
它的优点是简单直观,易于构造,很多编译系统
所实现。缺点是对文法要求很高,由于
递归调用多,影响分析器的效率。
其文法可以表示为
:
E
→
T
│
E+T
T
→
F
│
T*F
p>
F
→
i
│(
E
)
可以用语法图来表示语言的文法,如图:
E
T
F
T
T
+
F
F
*
i
(
E
)
3.2
中间代码形式描述
中间代码采用四元式输出,一个四元式是一个带有四
个域的记录结构,这四个域分别称
为
op
﹑
arg1
﹑
arg2
及
result
。域
op<
/p>
包含一个代表运算符的内部码。语句
do c=a+b
while
a
3
武汉理工大学《编译原理》课程设计说明书
的四元式输出形式如下:
100
( + , a , b , T )
101
( = , T , - , c )
102
( j<, a , b , 100 )
4
.简要的分析与概要设计
4.1
全局程序概要设计
递归下降分析技术就是通过对每个
非终结符编写一个子程序来实现它的操作,
然后通过
递归的调用
来实现对输入字符串的分析,
这其中还包括对输入字符串的词法分析。
< br>在词法分析
的时,得到的字符单词要和关键字比较,看是否是关键字,根据比较结
果进行返回相应的单词
类型。
单词类型主要包括界限符,
关键字,
常量,
标识符,
运算符等,
每种符号都是一种类型。
在语法分析程序中,根
据词法得到的结果,进行判断是否是当前需要的单词类型,如果不是就
说明输入字符串不
能由该文法推导出来;
如果是当前需要的类型,
就相应得做该单
词类型分支
程序。
根据文法可以得到这个递归下降程序可以分析
while
语句,在文法的开始符号
S
开始进
行
递归调用,因此这个文法的递归中就要考虑到调用以及递归。在递归子程序中,在嵌套调用
其他子程序时都是有一定条件的,当满足这个条件的时候该程序可以按照满足的条件执行下
去,当没有满足程序中的条件时就会显示语法错误。
4.2
词法分析
词法分析程序的任务是:
从左
至右逐个字符地对源程序进行扫描,
产生一个个的单词符号,
把
作为字符串的源程序改造成为单词符号的中间程序。词法分析检查的错误主要是挑出源程序
中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中
< br>的错字。
4
武汉理工大学《编译原理》课程设计说明书
4.3
递归下降翻译器的设计
1.
对每个非终结符
A
构造一个函数过程,
对
A<
/p>
的每个继承属性设置一个形式参数,
函数
的返回值为
A
的综合属性,
A
对应的函数过程中,为出现在
A
的产生式中的每
一个文
法符号的每一个属性都设置一个局部变量。
2.
非终结符
A
对应的函数过程中,根据当前的输入符号决定使用哪个产生式候选。
3.
每个产生式对应的程
序代码中,按照从左到右的次序,对于单词符号,非终结符和语
义动作分别做以下工作。
(
1
)对于
带有综合属性
x
的终结符
X
,把
x
的值存入为
X
p>
,
x
设置的变量中。然后产
生一个匹配
X
的调用,并继续读入一个输入符号。
p>
(
2
)对于每个
非终结符号
B
,产生一个右边带有函数调用的赋值语句
c=B(b1,b2,…
,
bk)
(
3
)
< br>对于语义动作,
把动作的代码抄进分析器中,
用代表属性
的变量来代替对应属性
的每一次引用。
4.4
语法制导翻译
在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或
语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号
入栈时,
必须连属性一起入栈,这样,栈符号就由文法符号及
存放该符号属性的域所组成。由于属性类
型不同,属性域存放的内容就要根据属性的类型
来定。有的可能直接存放属性值,也有的存放
的是指向属性值的指针。对于综合属性,其
属性域不存放其属性值,而是存放一个指针,指向
存贮该属性值的单元。对于继承属性,
其属性域直接保存其属性值。继承属性的属性域刚入栈
时为空,但是在该栈符号变成栈顶
符号之前的某一时刻,它们必须接受相应的属性值,即在成
为栈顶时,继承属性的属性域
必须有值。
5
测试方法和测试结果
5.1
测试方法
编写好
源程序,连接运行无误后,用几个简单的
while
语句检测其
正确性,如:输入
do-while
语句:
Wa <
br>则需对源程序进行检查修正,
,
看其输出结果是否与我们所预期
的结果一致,
如果不一致,
5
武汉理工大学《编译原理》课程设计说明书
我们可以用逐步调试的方法来对源程序进行跟踪分析
,
找出
出错的地方和原因,在对其进行修改,重新调试运行,直
到输出正确的结果为止。若输出
结果正确,还要多用几个
whi
le
语句对其进行检测,直到所有输出结果正确。
5.2
测试结果
测试结果如下:
6
经验与体会
在做本次实验之前我对
LL(1)
文法的构成
,
递归下降原理不是很了解
,
在查阅了相关资料
后
,
对此有了深入了
解
.
在整个设计过程中
,
将词法分析做为一个单独的模块
,
它可以被任何语<
/p>
法分析调用
,
提高独立性
.
并且在编程之前就已经将程序的概要设计都做出来了,
所以在编写程
序的时候相对比较容易。
词法分析,
语法分析都是很容易的,
只要理解了分析方法的实现原理,
6
武汉理工大学《编译原理》课程设计说明书
编写程序判断输入字符串是否满足给定的文法是比较简单的。
本次的设计的不足主要体现在以下几个方面,首先,因为前几次的实验都没有把词法分析
器编出来,因此程序中我没有采用词法分析器,只能够对唯一的
Da=a+bWa
进行识别,同样
后面的语义分析也只能
对这个起作用;再次,由于我所设计的栈中只能一个字符一个字符的存
放,因此只能用<
/p>
D
W
分别表示
do
while
;而且我对语法制导翻译这一块很不熟悉,因此我始终
< br>不能用程序实现语法制导翻译输出四元式,于是根据自己的理解,直接把四元式写了出来。
在这次课程设计的过程中,我也遇到了很多难题。在种种的困难中,我明白了
在编写程序
时要有耐心。如果你没有耐心,即使再好的思路也不会得到很好的表达,特别
是在调试的过程
中,对于各种各样的错误,要特别的有耐心去自习分析原因,特别是一些
基本的语法错误,不
能一看到错误很多就乱了阵脚,更不能轻易的放弃,半途而废。
p>
通过此次课程设计,
再次对编译原理的基础知识和一些实际操作只是有了一定的了解,
对高级语言
在计算机上进行编译分析的过程有了一定的了解。
7
附录
源代码:
/*
文法
G(s)
s-->DGWE
G-->c=R
R-->dTe|d
T-->+|-|*|/
E-->aFb
F--> >|==|<
*/
#include
#include
#include
#include
7
-
-
-
-
-
-
-
-
-
上一篇:文件输入输出流
下一篇:2020-2021年中考英语书面表达专项练习经典经典1