编译原理第五章详解.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.3 某些非LL(1)文法到LL(1)文法的等价交换 确定的自顶向下分析要求对给定语言的文法必须是LL(1)形式。 但是,不是所有的语言都有LL(1)文法。 不是LL(1)文法的原因,要么是直接或间接左递归;要么含有左公共因子。 左公共因子:文法中形如A→αβ|αγ 直接左递归:A→Aβ; 间接左递归:A→Bβ;B→Aα 消除左递归或左公共因子,能否将非LL(1)文法转换成LL(1)文法? 提取左公共因子 若文法中含有形如:A→αβ|αγ的产生式,这导致了对相同左部的产生式其右部的FIRST集相交,不满足LL(1)文法的充分必要条件。 将产生式A→αβ|αγ等价变换为: A→α(β|γ) 引进新的非终结符A’,使产生式变换为: A→αA’;A ’→ β|γ 一般形式为: A→αβ1|αβ2|αβ3|….|αβn 提取左公因子: A→α(β1|β2|β3|….|βn) 引进新非终结符A’: A→αA’; A’→β1|β2|….|βn 若β1β2β3….βn中仍含有左公共因子,可再次提取,这样反复进行提取,直到引进新非终结符的有关产生式再无左公共因子为止。 例5. 6 (提取左公共因子后为非LL(1)) 若文法G1的产生式为: (1)S→αSb (2) S→αS (3) S→ ε; 对(1)(2)提取左公共因子后得: S→αS(b| ε) S→ ε; 进一步变换为文法G‘1 S→αSA A→b A→ ε S→ ε; 例5. 7(提取左公共因子后为LL(1)) 若文法G2的产生式为: 1、A→ad;2、A→Bc 3、B→aA;4、B→bB 产生式2的右部以非终结符开始,因此,左公共因子可能是隐含的。用其相同左部而右部以终结符开始的产生式进行相应替换。 1、 A→ad; 2、A→aAc;3、 A→bBc 4、 B→aA;5、B→bB 提取1、2的左公共因子得: A→a(d|Ac); A→bBc; B→aA;B→bB 引进新非终结符A’,得文法G‘2 A→aA’; A→bBc; A‘→d; A‘→ Ac; B→aA;B→bB 例5.8(提取左公共因子后,产生无用产生式,必须化简文法) 若有文法G3的产生式为: 1、S→aSd;2、S→Ac; 3、A→aS;4、A→b 用3、4中的右部替换2中的右部的A,得 1、 S→aSd; 2、S→aSc;3、 S→bc; 4、 A→aS;5、A→b 对1、2提取左公共因子 S→aS(d|c); 引进新的非终结符A’后得 1、 S→aSA‘;2、S→bc; 3、A’ →d|c; 4、A→aS;5、A→b 非终结符A变成不可到达的符号,产生式4、5为无用的产生式。 例5.9(不能在有限步骤内提取完左公共因子) 若有文法G4的产生式为 1、S→Ap|Bq;2、A→aAp|d;3、B→aBq|e 用2、3的右部替换1中的A、B得 1、S→aApp|aBqq;2、S→dp|eq 3、A→aAp|d;4、B→aBq|e 对1提取左共因子的 S→a(App|Bqq); 引入新的非终结符S‘后得 1、 S→aS’; 2、S→dp|eq ;3、S’ →App|Bqq; 4、A→aAp|d;5、B→aBq|e; 用4、5中的右部替换3中的A、B,再提取左共因子,不断进行。 不一定每个文法的左公共因子都能在有限步骤内替换无左公共因子的文法。 一个文法提取了左公共因子后,只解决了相同左部产生式右部的FIRST集不相交问题,当改写后的文法不含空产生式,且无左递归时,则改写后的文法是LL(1)文法,否则还需要用LL(1)文法的判别方式进行判断才能确定是否为LL(1)文法。 消除左递归 一个文法含有下列形式的产生式时: a A→Aβ b A→B β; B→Aα 在a 中可称为含有左递归的规则或称为直接左递归;在b 中为文法中含有左递归或间接左递归;文法中只要含有a 或b 或者二者皆有均认为文法是左递归的。 文法是左递归时不能采用自顶向下分析方法。 例5.11 有文法G6为: 1、A→aB;2、A→Bb; 3、 B→Ac;4、 B→d; 若有输入串为adbcbcbc#,则分析过程的语法树如下: A a B A c B b d A a B A c B b A c …… 利用这样的推导不是 不能推导出匹配,而 是要不断地进行回溯。 不是确定的分析方法。 含有左递归的文法绝对不是LL(1)文法。不能用确定的自顶向下分析法。 为了使某些含有左递归的文法经等价变换消除左递归后可能变成LL(1)文法,可采用下列变换公式: a 消除直接左递归,把直接左递归改写为右递归 b)消除间接左递归,先将间接变直接,然后,按a) c)消除文法中一切左递归的算法。 消除直接左递归,把直接左递归改写为右递归 对文法:S→Sa;S→b 可改写为

文档评论(0)

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

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

1亿VIP精品文档

相关文档