关键词不能为空

当前您在: 主页 > 英语 >

武汉理工大学 DO-WHILE语句的翻译分析程序设计 ———递归下降法、输出四元式

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:57
tags:

-

2021年3月3日发(作者:火炭)


武汉理工大学《编译原理》课程设计说明书



DO- WHILE


语句的翻译分析程序设计






















———递归下降法、输出四元式



1


问题描述



1.1


问题描述




设计一个


DO-WHILE


循环语句的词法﹑语法及语义分析程序,


语法分析选择递归下降法,


采用用语法制导翻译输出中间代码四元式。



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>::=<


表达式


2> * <


表达式


3> |<


表达式


2> / <


表达式


3> | <


表达式


3>



<


表达式


3>::=(<


表达式


>) | <


标识符


>|<


数字


>




1


武汉理工大学《编译原理》课程设计说明书


< br><


赋值语句


>::=<


标识符< /p>


>=<


表达式


>






2.2 DO- while


循环语句文法的描述



产生式为


S-> do E while A


,为便于语法制导翻译将其改写如下:




文法


G(s)

< p>
如下:















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




gen(’:’)







gen(‘goto’



)






3.


语法分析方法及中间代码形式的 描述




3.1


语法分析方法




2


武汉理工大学《编译原理》课程设计说明书










是< /p>









< p>














(S,A,B,C,D,E,F,G


,H)


。每个子程序处理相应句型中相对于此非终结符号的产生式。在定义文法


时,是递归定义的,所以这些子程序也是递归的。当一个子程序调用另一个子程序时,原子程< /p>


序顺序执行语句,


即总是先执行被调用的子程序,


然后再执行后继的程序。


程序中


9

个子程序,


其中


S


是开始符号, 也是递归下降分析的入口,通过调用词法分析器进行单词分析,并通过


word=_()


来得到当前所分析到的单词,


然后在递归语法分析中根据这个单 词分


析下一步要执行的子程序。其中要注意的是,当子程序


G( )



H()


中出现匹配的是空字符串时 ,


不做单词处理,该所取得的单词,应该为下一个匹配产生做准备。



它的优点是简单直观,易于构造,很多编译系统 所实现。缺点是对文法要求很高,由于



递归调用多,影响分析器的效率。




其文法可以表示为




E



T



E+T


T


F



T*F










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

< p>
,把


x


的值存入为


X



x


设置的变量中。然后产


生一个匹配


X


的调用,并继续读入一个输入符号。




2


)对于每个 非终结符号


B


,产生一个右边带有函数调用的赋值语句


c=B(b1,b2,…



bk)




3


< br>对于语义动作,


把动作的代码抄进分析器中,


用代表属性 的变量来代替对应属性


的每一次引用。





4.4


语法制导翻译



在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或


语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号 入栈时,



必须连属性一起入栈,这样,栈符号就由文法符号及 存放该符号属性的域所组成。由于属性类


型不同,属性域存放的内容就要根据属性的类型 来定。有的可能直接存放属性值,也有的存放


的是指向属性值的指针。对于综合属性,其 属性域不存放其属性值,而是存放一个指针,指向


存贮该属性值的单元。对于继承属性, 其属性域直接保存其属性值。继承属性的属性域刚入栈


时为空,但是在该栈符号变成栈顶 符号之前的某一时刻,它们必须接受相应的属性值,即在成


为栈顶时,继承属性的属性域 必须有值。



5


测试方法和测试结果



5.1


测试方法










编写好 源程序,连接运行无误后,用几个简单的


while


语句检测其 正确性,如:输入


do-while


语句:

Wa



看其输出结果是否与我们所预期 的结果一致,


如果不一致,



5


武汉理工大学《编译原理》课程设计说明书


< br>则需对源程序进行检查修正,


我们可以用逐步调试的方法来对源程序进行跟踪分析 ,


找出


出错的地方和原因,在对其进行修改,重新调试运行,直 到输出正确的结果为止。若输出


结果正确,还要多用几个


whi le


语句对其进行检测,直到所有输出结果正确。




5.2


测试结果



测试结果如下:






6


经验与体会



在做本次实验之前我对


LL(1)


文法的构成


,


递归下降原理不是很了解


,


在查阅了相关资料



,


对此有了深入了 解


.


在整个设计过程中


,


将词法分析做为一个单独的模块


,


它可以被任何语< /p>


法分析调用


,


提高独立性


.


并且在编程之前就已经将程序的概要设计都做出来了,


所以在编写程


序的时候相对比较容易。


词法分析,

< p>
语法分析都是很容易的,


只要理解了分析方法的实现原理,



6


武汉理工大学《编译原理》课程设计说明书



编写程序判断输入字符串是否满足给定的文法是比较简单的。



本次的设计的不足主要体现在以下几个方面,首先,因为前几次的实验都没有把词法分析


器编出来,因此程序中我没有采用词法分析器,只能够对唯一的


Da=a+bWa


进行识别,同样


后面的语义分析也只能 对这个起作用;再次,由于我所设计的栈中只能一个字符一个字符的存


放,因此只能用< /p>


D


W


分别表示


do

while


;而且我对语法制导翻译这一块很不熟悉,因此我始终

< br>不能用程序实现语法制导翻译输出四元式,于是根据自己的理解,直接把四元式写了出来。



在这次课程设计的过程中,我也遇到了很多难题。在种种的困难中,我明白了 在编写程序


时要有耐心。如果你没有耐心,即使再好的思路也不会得到很好的表达,特别 是在调试的过程


中,对于各种各样的错误,要特别的有耐心去自习分析原因,特别是一些 基本的语法错误,不


能一看到错误很多就乱了阵脚,更不能轻易的放弃,半途而废。




通过此次课程设计,


再次对编译原理的基础知识和一些实际操作只是有了一定的了解,


对高级语言 在计算机上进行编译分析的过程有了一定的了解。



7


附录



源代码:




/*


文法


G(s)




s-->DGWE




G-->c=R




R-->dTe|d




T-->+|-|*|/




E-->aFb




F--> >|==|<




*/



#include








#include











#include








#include




7

-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:57,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/700113.html

武汉理工大学 DO-WHILE语句的翻译分析程序设计 ———递归下降法、输出四元式的相关文章

武汉理工大学 DO-WHILE语句的翻译分析程序设计 ———递归下降法、输出四元式随机文章