- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2. 消除左递归 什么是左递归? 左递归的害处是什么? 怎样消除左递归? 问题: (1) 什么是左递归?(在第二章讲过) 一个文法含有下列形式的产生式: (a) A::=Aβ A∈VN , β∈V* (b) A::=Bβ B::=Aα A,B∈VN , α,β∈V* 上面中的形式称为直接左递归,或说文法中含 有左递归的产生式。(b)中的形式在推导中会产生: A=+A…,称为间接左递归,或说文法中含有左递 归。 一个文法是左递归的,产生式中含有(a)或 (b)或两者都有的形式。 (2) 左递归的害处 a)使自顶向下分析过程产生回溯。 b) 使自顶向下分析过程产生无限循环。 例:文法G[S]含有直接递归: S::=Sa S::=b 产生的语言是L={ban|n≥0} 输入当前串w=baaaa# 当输入符号为b时,应选产生式S::=b推导,但这 样推不出b的后面部分字符,因此回溯,选择另一个产生式。 当选用产生式S::=Sa时,向左推导出现: 例:对间接左递归同样会出现上述现象: 有文法G[A]: (1) A::=aB (2) A::=Bb (3) B::=Ac (4) B::=d 若输入串为w=adbcbcbc# 分析过程: 注: 含有左递归的文法一定不是LL(1)文法,不能用于确定的自顶向下分析方法中。不含左递归的方法可能是,也可能不是LL(1)文法。 将某些含有左递归的文法,消除左递归后可能变换成为LL(1)文法。 消除左递归的方法 消除直接左递归,把直接左递归改为右递归。 采用:引进新的非终结符号变换文法的方法。 例:设有文法G[S]: S::=Sa S::=b ∵SELECT(S::=Sa) ∩SELECT(S::=b)=FIRST(Sa)∩FIRST(b)={b}∩{b} ≠Φ ∴此文法不是LL(1)文法 引进非终结符号S’,改写G: S::=bS’ S’::=aS’|ε ∵SELECT(S’::=aS’) ∩SELECT(S’::=ε)=FIRST(aS’)∩FIRST(ε) ∪FOLLOW(S’) ={a}∩{ε}∪{#} =Φ ∴此文法是LL(1)文法 一般方法:假定A的全部产生式: A::=Aα1|Aα2|…|Aαm|β1|β2|…|βn 其中:αi(1≤i≤m)不为ε,βi(1≤j≤m)不以A开头。 消除直接左递归后,改写为: A::= β1A’|β2A’|…|βnA’ A’::= α1A’|α2A’|…|αmA’|ε 例: A::=[B (A是识别符号) B::=X]|BA X::=Xa|Xb|a|b 引进非终结符B’和X’直接改写: A::=[B B::=X]B’ B’::=AB’|ε X::=aX’|bX’ X’::=aX’|bX’|ε 消除间接左递归 方法:首先将间接左递归变为直接左递归 然后,按a)消除直接左递归 例:有文法G[A]: (1) A::=aB (2) A::=Bb (3) B::=Ac (4) B::=d 解:将G改为直接左递归。 把(1)(2)产生式的右部替换(3)式右部的A得: A::=aB A::=Bb B::=aBc B::=Bbc B::=d 按消除直接左递归改写: A::=aB A::=Bb B::=(aBc|d)B’ B’::=bcB’|ε 请大家验证:改写后的文法是否为LL(1)文法。 消除文法中一切左递归的算法 算法要求:文法中不含回路,即无A=+A的推导。 满足这个要求的充要条件:文法中不含形如: A::=A和A::= ε的产生式。 算法的步骤: 1o 将文法G中所有非终结符按某一顺序排列: A1, A2,…, An 2o 执行: For i=1 to n do Begin For j:=1 to i-1 do Begin 将产生式Ai::=Ajα中的Aj替换成: Ai::= β1α|β2α|…|βmα(其中,Aj::= β1 |β2 |…|βm) End; 消除Ai产生式中的直接左递归 End; 3o 化简改写后的文法,删除多余产生式 例:有文法G[S]: (1)S::=Qc|c (2)Q::=Rb|b (3)R::=Sa|a 该文法每个非终结符为间接左递归,且无空产生式和形如A::=A产生式符合算法的条件。 1o 将文法的非终结符排序为:S,Q,R 2o执行算法:(当i=1时,执行算法对文法不产生影响) 当i=2,j=1时,应改写产生式Q::=Rb|b,但右部不含S,所以(1)式中的s不能代入(2)中, 当i=3,j=1时,应改写产生式R
文档评论(0)