网站大量收购独家精品文档,联系QQ:2885784924

编译原理及其习题解答(武汉大学出版社)课件chap5.ppt

编译原理及其习题解答(武汉大学出版社)课件chap5.ppt

  1. 1、本文档共113页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
消除文法中一切左递归的算法(2/2) (3)化简由(2)所得的文法,即去除那些从开始符号出发永远无法达到的非终结符的产生式规则。 例子如下: 消除全部左递归的 例子 文法G[S]: S→Qc | c Q→Rb | b R→Sa | a 解:令文法的非终结符排序为R,Q,S。对于R不存在直接左递归,把R代入到Q的有关候选后,Q的规则变为: Q→Sab | ab | b 现在Q同样不含直接左递归,把它代入到S的有关候选后,S变成: S→Sabc | abc | bc | c 消除S的直接左递归后,得到整个文法为: S→abcS’ | bcS’ | cS’ S’→ abcS’ | ε Q→ Sab | ab | b R→ Sa | a 例(续)   显然,其中关于Q和R的产生式是多余的,经过化简后最后所得的文法是 S→abcS’ | bcS’ | cS’ S’→ abcS’ | ε 注意:由于对非终结符排序的不同,最后所得的文法在形式上可能是不一样的,但它们是等价的。例如,排列顺序为S、Q、R时: 例(续) 令文法的非终结符排序为S、Q、R。对于S不存在直接左递归, Q同样不含直接左递归。把S代入到R的有关候选后,R的规则变为: R→Qca | ca | a 现在Q同样不含直接左递归,把它代入到R的有关候选后,R变成: R→Rbca | bca | ca | a 消除R的直接左递归后,得到整个文法为: S→Qc | c Q→ Rb | b R→( bca | ca | a)R’ R’→ bcaR’ | ε 5.4不确定的自顶向下分析思想 1. 当文法不是LL(1)文法时,不能用确定的自顶向下的分析,可采用不确定的自顶向下的分析方法,即带回溯的自顶向下的分析方法。 2. 带回溯的自顶向下的分析是一个试探的过程,当分析不成功时,退回到适当的位置,再重新试探其余候选的产生式。 这种方式,需要记录已经选过的产生式,直到都试探完毕仍不成功,才能确定输入串不是该文法的句子。 3. 编译程序实现时,一般是边分析边插入语义动作。带回溯的分析代价很高,效率很低,不实用。 5.4不确定的自顶向下分析思想 引起回溯的原因: 1. 由于相同左部产生式的右部FIRST集交集不为空; 例如文法G[S]: S→ xAy A→ ab | a 分析输入串xay#。 2. 由于相同左部的非终结符的右部能 ε,且该非终结符FOLLOW集中含有其右部FIRST集中的元素; 例如文法G[S]: S→ aAS | b A→ bAS | ε 分析输入串ab# 3. 由于文法含有左递归而引起的回溯 5.5 确定的自顶向下的分析方法 一、递归子程序法:   在源程序的编译过程中,对于每一个语法成份(非终结符)用相应的子程序处理。而子程序又分为简单子程序(不调用任何子程序)、嵌套子程序(调用其它子程序,但不调用它自身)、递归子程序(直接或间接调用它自身)。   由于程序设计语言的许多语法成份是递归定义的,因此处理它的相应子程序也是递归子程序,这种分析方法的名称也由此而得名。 递归子程序法的编译思想    从文法的识别符号开始,在语法规则支配下进行语法分析。逐个扫描单词符号序列,根据文法和当前输入符号预测到下一个语法成份v时,便确定v为目标,并调用和识别v的子程序,在分析v的过程中,又可能确立其它(或自身)子目标并调用相应的子程序,如此继续下去。 递归子程序法设计的注意点 由于递归子程序在退出之前又可能再次进入程序,因此不用一个固定单元来存放返回地址,而是需要开辟一个栈存放返回地址。因此,在编译写递归子程序时,应注意处理程序的入口和出口(所谓入口是应将返回地址送至地址栈栈顶;出口是应从返回地址栈栈顶取返回地址)。 子程序 设a?VT,P(a)代表语句:if ch=a then READ(ch) else error 设?=x1x2…xn,x1?(VN?VT), P(?)代表语句:P(x1); P(x2);… P(x

文档评论(0)

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

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

1亿VIP精品文档

相关文档