编译原理第05章自顶向下语法方法题稿.ppt

编译原理第05章自顶向下语法方法题稿.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
提取左公共因子 若文法中含有形如:A→??|??的产生式,这导致了对相同左部的产生式其右部的FIRST集相交,也就是SELECT(A→??)∩SELECT(A→ ??) ≠?,不满足LL(1)文法的充分必要条件。 现将产生式A→??| ??进行等价变换为: A→ ?(?|?) 其中‘(’,‘)’为元符号,可进一步引进新非终结符A′,去掉‘(’,‘)’使产生式变换为: A→?A′ A′→?|? 写成一般形式为: A→ ?? 1| ?? 2|…| ?? n,提取左公共因子后变为: A→ ? (?1| ?2|…| ?n),再引进非终结符A′,变为: A→ ? A′ A′→?1| ?2|…| ?n 若在?i、 ?j、 ?k … (其中1≤i,j,k≤n)中仍含有左公共因子,这时可再次提取,这样反复进行提取直到引进新非终结符的有关产生式再无左公共因子为止。 例5.6 若文法G1的产生式为: (1) S→aSb (2) S→aS (3) S→ε 请提取文法中的左公因子。 解答: 对产生式(1)、(2)提取左公因子后得: S→ aS(b|ε) S→ε 进一步变换为文法G′1: S→aSA A→b A→ε S→ε 例5.7 若文法G2的产生式为: (1) A→ad (2) A→Bc (3) B→aA (4) B→bB 请提取文法中的隐式左公因子。 产生式(2)的右部以非终结符开始,因此左公共因子可能是隐式的,所以这种情况下对右部以非终结符开始的产生式,用其相同左部而右部以终结符开始的产生式进行相应替换,对文法G2分别用(3)、(4)的右部替换(2)中的B,可得: (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为: (1) A→aA′ (2) A→bBc (3) A′→d (4) A′→Ac (5) B→aA (6) 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 显然,原文法G3中非终结符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再提取左公共因子最后结果得: (1) S→aS′ (2) S→dp|eq  (3) S′→aS″  (4) S′→dpp|eqq  (5) S″→Appp|Bqqq  (6) A→aAp|d  (7) B→aBq|e 可以看出若对(5)中产生式A、B继续用(6)、(7)产生式的右部替换,只能使文法的产生式愈来愈多无限增加下去,但不能得到提取左公共因子的预期结果。 消除左递归 设一个文法含有下列形式的产生式。 1)A→Aβ A∈VN,β∈V* 2)A→Bβ B→Aα A,B∈VN, α,β∈V* 称含1)中产生式的文法为含有左递归的规则或称直接左递归的。 含2)中产生式的文法有A=+A … 则称文法中含有左递归或间接左递归. 文法中只要含有1)或含有2)的产生式或二者皆有均认为文法是左递归的。 消除左递归的步骤 消除左递归的算法 示例: 例5.10 例5.11 例5.12 消除左递归的步骤 1)把文法的所有非终结符按某一顺序排序; 如A1,A2,…,An 2)从A1开始消除左部为A1的产生式的直接左递归,然后把左部为A1的所有规则的右部逐个替换左部为A2右部以A1开始的产生式中的A1,并消除左部为A2的产生式中的直接左递归。继而以同样方式把A1,A2的右部代入左部为A3右部以A1

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档