WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx

上传人:b****4 文档编号:17024885 上传时间:2022-11-27 格式:DOCX 页数:10 大小:68.21KB
下载 相关 举报
WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx_第1页
第1页 / 共10页
WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx_第2页
第2页 / 共10页
WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx_第3页
第3页 / 共10页
WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx_第4页
第4页 / 共10页
WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx

《WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx》由会员分享,可在线阅读,更多相关《WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。

WHILE循环语句的翻译程序设计递归下降法输出四元式Word文件下载.docx

(3)写出给定得语法分析方法得思想,完成语法分析与语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计得分析程序、

(5)设计报告格式按附件要求书写。

课程设计报告书正文得内容应包括:

1 系统描述(问题域描述);

2文法及属性文法得描述;

3 语法分析方法描述及语法分析表设计;

4 按给定得题目给出中间代码形式得描述及中间代码序列得结构设计;

5编译系统得概要设计;

6详细得算法描述(流程图或伪代码);

7软件得测试方法与测试结果;

8 研制报告(研制过程,本设计得评价、特点、不足、收获与体会等);

9参考文献(按公开发表得规范书写)。

时间安排:

设计安排一周:

周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语句〉:

:

=while(<条件语句〉) do{<

赋值语句>

〈条件语句>

:

= 〈表达式〉〈条件运算符〉〈表达式>

 <

表达式>:

=<

表达式>

 +<表达式2>

| 〈表达式〉—<表达式2>|<表达式2>

〈表达式2〉:

=〈表达式2>

* 〈表达式3> |<

表达式2〉/<表达式3>| <表达式3>

表达式3〉:

=(〈表达式>

)|〈标识符>

|〈数字>

赋值语句〉:

=〈标识符>=<表达式>;

根据以上写出来得While循环语句得文法表示如下:

  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。

placeD、placeC2、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:

Emit(G1。

Place’:

'+’E.PlaceG2。

place)}

G-〉-EG

{G.Place:

=newtemp;

Emit(G1。

-’E。

PlaceG2。

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。

PlaceH2、place)}

H->ε

{G、Place:

=newtemp;

Emit(H1。

Place’:

’+’E、PlaceH2.place)}

F—〉(C) 

{F、Place:

=C。

Place}

B->i=C;

{p:

=lookup(i。

name)

Ifp!

=nilthen

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)ifchar∈first(β1)thenζ(β1)

       elseifchar∈first(β2)then ζ(β2)

             else…

          ifchar∈first(βn)then ζ(βn)

      else   ERROR

其中ζ(βi)表示调用处理符号串βi得子程序。

对A得任一右部i设为:

 βi = y1y2…yn

则定义ζ(βi) beginζ(y1);

ζ(y2);

…;

ζ(yn)end

其中yj可分为下列两种情况(j=1,…,n):

1)  yj∈VT,则

ζ(yj)ifchar≠yjthen ERRORelse READ(char)

2) yj∈VN,则ζ(yj)表示调用关于yj得递归子程序。

四.中间代码形式得描述及中间代码序列得结构设计

4。

1四元式形式

 中间代码为四元式,按照要求,要输出四元式一个四元式就是一个带有四个域得记录结构,这四个域分别称为op﹑arg1﹑arg2及result。

域op包含一个代表运算符得内部码。

语句whilea<

bdo a=a+b得四元式输出:

1(〈, a,b,3)

     2 (j,_,_,6 )

3 (+,a,b,n)

     4(=,n, _,a)

   5(j,_,_,1)

  6

五.编译系统得概要设计

5.1全局程序得概要设计

  递归下降分析技术就就是通过对每个非终结符编写一个子程序来实现它得操作,然后通过递归得调用来实现对输入字符串得分析,这其中还包括对输入字符串得词法分析。

在词法分析得时,得到得字符单词要与关键字比较,瞧就是否就是关键字,根据比较结果进行返回相应得单词类型、单词类型主要包括界限符,关键字,常量,标识符,运算符等,每种符号都就是一种类型。

在语法分析程序中,根据词法得到得结果,进行判断就是否就是当前需要得单词类型,如果不就是就说明输入字符串不能由该文法推导出来;

如果就是当前需要得类型,就相应得做该单词类型分支程序。

根据文法可以得到这个递归下降程序可以分析while语句,在文法得开始符号S开始进行递归调用,因此这个文法得递归中就要考虑到调用以及递归。

在递归子程序中,在嵌套调用其她子程序时都就是有一定条件得,当满足这个条件得时候该程序可以按照满足得条件执行下去,当没有满足程序中得条件时就会显示语法错误。

5。

2词法分析

词法分析程序得任务就是:

从左至右逐个字符地对源程序进行扫描,产生一个个得单词符号,把作为字符串得源程序改造成为单词符号得中间程序。

词法分析检查得错误主要就是挑出源程序中出现得非法符号。

所谓非法符号就是指不就是程序设计语言中允许出现得符号,就像自然语句中得错字、

5.3递归下降翻译器得设计

对每个非终结符A构造一个函数过程,对A得每个继承属性设置一个形式参数,函数得返回值为A得综合属性,A对应得函数过程中,为出现在A得产生式中得每一个文法符号得每一个属性都设置一个局部变量。

非终结符A对应得函数过程中,根据当前得输入符号决定使用哪个产生式候选。

每个产生式对应得程序代码中,按照从左到右得次序,对于单词符号,非3:

终结符与语义动作分别做以下工作、

1.对于带有综合属性x得终结符X,把x得值存入为X,x设置得变量中、然后产生一个匹配X得调用,并继续读入一个输入符号。

2.对于每个非终结符号B,产生一个右边带有函数调用得赋值语句c=B(b1,b2,…,bk)

3.对于语义动作,把动作得代码抄进分析器中,用代表属性得变量来代替对应属性得每一次引用。

5.4语法制导翻译

在语法分析过程中,随着分析得步步进展,根据每个产生式所对应得语义子程序(或语义规则描述得语义动作)进行翻译。

属性文法得每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性得域所组成。

由于属性类型不同,属性域存放得内容就要根据属性得类型来定。

有得可能直接存放属性值,也有得存放得就是指向属性值得指针。

对于综合属性,其属性域不存放其属性值,而就是存放一个指针,指向存贮该属性值得单元、对于继承属性,其属性域直接保存其属性值。

继承属性得属性域刚入栈时为空,但就是在该栈符号变成栈顶符号之前得某一时刻,它们必须接受相应得属性值,即在成为栈顶时,继承属性得属性域必须有值。

六.详细得算法描述

S()→W()→E→F()→D()→G()→R()→T()

方法与变量得定义

 

做W():

做E():

做F()  F -〉〈|=| 〉| 〈=|>

=

做Do_GG-〉c=R

对赋值语句进行四元式输出:

七.软件得测试方法与测试结果

输入while(a〉b){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语句得翻译,并能够用四元式将其输出,使人一目了然。

程序还能够准确提示词法与语法错误。

同时程序运行时简单明了,易于使用。

3收获与体会

深入了解计算机语言编译与运行得过程,对编译原理有了深刻得认识,掌握了递归下降法,熟练地使用四元式中间代码,明白了对于编写程序,解题得思路为重要。

在编写程序之前,如果没有比较清晰得思路,根本不可能编出好得程序。

就算马马虎虎得编出来,程序得逻辑性、健壮性、完善性、合理性也不会很强。

在编程之前,我们应反复研究题目要求,对题目涉及得情况进行比较充分得分析,以便编写出更加符合题意得程序;

其次要充分考虑各种临界情况,对一些错误得输入进行处理、因此在我们编程序之前一定要做好充分得准备,首先要理清自己得思路,然后再将思路分划成几个模块,逐块得写好算法,最后再将所有得模块有机得联系起来,组成一个完整得程序、在成功通过编译得情况下,对程序运行得结果进行系统得分析,检验其正确性,如果有错误,应立即去分析源程序得逻辑错误,直到得到正确得结果。

九.参考文献

《编译原理第2版》清华大学出版社张素琴等著

本科生课程设计成绩评定表

班级:

计算机1203    姓名:

闵丹枫 学号:

序号

评分项目

满分

实得分

学习态度认真、遵守纪律

10

2

设计分析合理性

10

设计方案正确性、可行性、创造性

20

设计结果正确性

40

5

设计报告得规范性

6

设计验收

10

总得分/等级

评语:

注:

最终成绩以五级分制记。

优(90—100分)、良(80-89分)、中(70-79分)、

及格(60-69分)、60分以下为不及格

             指导教师签名:

           201 年月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1