东北大学秦皇岛分校编译原理课件-第五章.ppt

东北大学秦皇岛分校编译原理课件-第五章.ppt

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 递归子程序法 递归子程序法是又一种广为流行的不带回溯的自顶向下语法分析方法。 递归子程序法又叫面向目标的分析方法。 递归子程序法的基本思想是:在源程序的编译过程中,对于每一个语法成分(用非终结符号代表),用相应的子程序来处理,而子程序又可进一步分为简单子程序、嵌套子程序、递归子程序。递归子程序法是由该分析程序是一些递归子程序的集合而得名的。 不同的文法的递归子程序完全不相同。因此对于每一个文法都得编写其分析程序。 * 构造给定文法的递归子程序分析法 (1)对每一个非终结符号U,编写一个相应子程序P(U); (2)对于递归出现的非终结符,其相应子程序中应有递归入口部分,及完成如下功能:K:=K+1;S[K]:=返回地址;(命名为:SCIN)另外,还应有递归出口部分,即完成如下功能:K:=K-1;GOTO S[K+1] (命名为SCOUT) (3)对于规则U→x1|x2|…|xn,显然,应有一个关于非终结符号U的相应子程序P(U),构造P(U)的方法是: IF ch IN FIRST(x1) THEN P(X1) ELSE IF ch IN FIRST(x2) THEN P(X2) ELSE … IF ch IN FIRST(xn) THEN P(Xn) ELSE ERROR * 构造给定文法的递归子程序分析法 (4)对于符号串X=y1y2…ym,其相应子程序P(x)的含义为: BEGIN P(y1) P(y2)…… P(ym) END 并且,如果yi∈VT,则P(yi)为:IF ch=yi THEN READ(ch) ELSE ERROR;如果yi∈VN ,则P(yi)就代表调用与yi相对应的子程序。 * 例:构造文法G[E]的递归子程序法的程序框图 G[E]: E→eBaA A→a|bAcB B→dEd|aC C→e|dC * * * * * * * * * 上一节我们讲了如何使用FIRST集合和FOLLOW集合来判断某个给定的文法是否是LL(1)文法,从而决定是否可以对文法采用LL(1)分析法进行分析。也就是说,只要我们能求出一给定文法的FIRST集合和FOLLOE集合,我们就能判断出文法是否是LL(1)文法。对于FIRST集合,我们可以直接根据FIRST集合的定义很容易地从文法的每条规则求出。 例如:文法G[E]:E::=E+T|T 其FIRST集合为: FIRST((E))={(} T::=T*F|F FIRST(i)={i} F::=(E)|i FIRST(T*F)={(,i} FIRST(F)={(,i} FOLLOW集合的求法相对来说要复杂得多。教材第76页给出了两种计算FOLLOW集合的方法。第一中是直接根据FOLLOE集合的定义来求。对于这种求法,我们给出一种描述得更为清楚的算法。该算法分为三个步骤, (1)对于文法的识别符号Z,令#∈FOLLOW(U);也就是说,输入结束符无条件地为文法识别符号的FOLLOW集合中的一个元素。 (2)如有形如 A::=?U? 的规则,则 FIRST( ?)中非 ε 的元素属于FOLLOW(U);即当非终结符号U是在规则的中间出现,并且其后面的字符串不可能推导成一个空字符串的时候,FOLLOW集合中的元素边式对U后面的字符串求头符号集合的结果集中的所有元素。 (3)如有形如 A::=?U 或 A::=?U? 而 FIRST(?) 含有 ε 元素这样的规则,则 FOLLOW (A)的元素属于FOLLOW(U)。即:当U是规则的最后一个符号,或者是U后面的字符串可以推导出空符号串的时候,FOLLOW(U)中的元素可以通过求规则左部的非终结符号A的FOLLOW集合得到。当然,求FOLLOW(A)同样遵循上面的三个步骤。 在用上算法求文法的非终结符号的FOLLOW集合时,有一个技巧,即,在求某个非终结符号U的FOLLOW集合时,只看U在右部出现的那些规则,根据规则再对照算法中的(1)(2)(3)条,根据满足的条件进行计算。 除了根据定义之外,还可以根据文法的关系图等方法来求。这个方法在这里我们不再讨论。 * * 首先,由于E为文法的识别符号,因此,#∈FOLLOW(U);又因为有规则 F::=(E),所以,)∈FOLLOW(E),于是得:FOLLOW(E)={#,)} 对于非终结符号T,由于有规则 E::=TB,所以,FIRST(B)中非ε元素“+”∈FOLLOW(T);又因为FIRST(B)中含有ε元素,

文档评论(0)

懒懒老巢 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档