[编译原理课件15.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[编译原理课件15

5.6 程序流控制语句的翻译 在源程序中,控制语句用于实现程序流程的控制。一般而言,程序流程控制可大致分为顺序结构(如复合语句)、分枝结构(如if条件语句和实现多分枝的case语句等)、循环结构(如for循环、while循环、repeat循环等等)三类。另外,GOTO语句也是一类常见改变流程的控制语句。下面,我们将对常见的一些控制结构的翻译进行讨论。 5.6.1 常见控制结构的翻译 程序设计理论已证明,任何程序均可由序列结构、条件分枝结构和while循环三种结构等价地表示。因此,我们先讨论这三类结构的翻译。这三类结构可用如下的文法描述: S→ if E then S(1) 2.?? | if E then S(1) else S(2) 3.?? | while E do S(1) 4.?? | begin L end (5.8) 5.?? | A 6.?? L→L ;S 7.?? | S 有关控制结构文法的注解 上述文法中,非终结符S、L、A分别代表语句、语句串和赋值语句,E代表布尔表达式。此外,由于if语句可能带来二义性,我们约定每一个else总是与其前离它最近的尚未得到匹配的then相匹配。在文法(5.8)中,为了区别同一产生式中不同位置上的同名文法符号,我们为其增加了上标。 条件语句的处理方法 在5.5节的图5-5中,我们已经给出了if语句和while语句的代码结构。 布尔表达式E具有两个属性:E.TC与E.FC,用来分别指示E的真链和假链的链首。 当E出现在条件语句if-then-else中时,根据条件语句的语义,当语法分析器扫视到then时, E的真出口已经确定,此时即可用NXQ对E的真链进行回填;而当扫视到else时,即可用NXQ对E的假链进行回填。 用S.CHAIN代表S的出口链。 条件语句的翻译结构 因此,if-then-else结构的翻译文法可写为: S→if E then {BackPatch(E.TC,NXQ);/*动作1:回填E的真链*/} S(1) else { T=NewTemp();T=Merge(NXQ, S(1).Chain); GEN(j,0,0,0); /*S(1)的常规出口,由此转出所在的条件语句;注意:此时NXQ在GEN函数内被加1 */ BackPatch(E.FC,NXQ); (5.9) /*动作2:将S(1)的常规出口与S(1)程序结构内的其它出口(已在的翻译过程中拉成链,由S(1).Chain属性指示)合并成一个链;并以S(2)的第一条四元式的序号回填E的假链*/ } S(2) {S.Chain=Merge(T, S(2).Chain); /*动作3:将的S(2)出口与S(2)的出口合并,作为S的出口*/ } 属性文法结构分析 从文法中可看出,产生式左部符号S的综合属性Chain是经过两个语义动作(2和3)之后才最终确定的,在这两个动作之间,还执行了语法分析动作(移进else,并移进和归约出S(2))。 另外,在产生式右部符号之间插入语义动作,容易带来混乱,它不易阅读,在具体的编译系统中也不易实现。 常见的编译系统中,往往希望将语义动作置于产生式中所有文法符号的右侧.目的是使翻译按这样方式进行,当用某产生式进行归约时,在完成了语法分析动作(归约)之后,执行相应的语义动作(语义子程序),即使用S-属性波兰翻译文法。 改造文法的两种途径 对上述翻译文法进行改造的方法有二: 1.将所有出现在 “中部”的动作符号(语义动作)用一新的非终结符取而代之,并为其定义一个ε-产生式,所配的语义动作即为原来的动作符。例如,(5.9)式可改写为: S→ if E then M1 S(1) else M2 S(2) {/*动作3*/} M1 →? {/*动作1*/} (5.10) M2 ? ? {/*动作2*/} 2.将原产生式“拆分”成若干个“小”产生式,拆分点就设在每个动作符的出现处,以保证动作符均出现在最右侧。例如,(5.9)可改写为: S ? U S(2) {/*动作3*/} U ? T S(1) else {/*动作2*/} (5.11) T ? if E then {/*动作1*/} 两种文法改造方法的比较 第一种方法较简单,且对原文法的可读性影响不大,在需插入的动作不多时,可采用此法。 但若使用此法过多,就会带来由于大量ε-产生式的引入而产生新的文法冲突的问题,使语法分析无法进行。 因此,更好的方法是“拆分法”,经验表明,这种方法基本上不会对原文法的语法分析带来影响,且产生式相对“短” 些,存取

文档评论(0)

wu12youli + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档