- 1、本文档共88页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 自顶向法分析方法
用预测分析程序,栈和预测分析表对输入串i+i*i#进行分析 本章小结 确定的自顶向下分析方法虽对文法有一定的限制,但由于实现方法简单、直观,便于手工构造或自动生成语法分析器,因而仍是目前常用的方法之一。要求通过本章的学习后,能够对一个给定的文法判断是否是LL(1)文法;能构造预测分析表;能用预测分析方法判断给定的输入符号串是否是该文法的句子;对某些非LL(1)文法做等价变换后可能变成LL(1)文法。 复习要点 语法分析常用的方法 会求FIRST、FOLLOW集 LL(1)文法的条件 左递归文法 构造LL(1)分析表 * 写成一般形式为: 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→?进一步变换为文法G1:S→aSAA→bA→?S→? 例5.7 若文法G2的产生式为: (1) A→ad (2) A→Bc (3) B→aA (4) B→bB请提取文法中的隐式左公因子。 (1) A→ad(2) A→aAc(3) A→bBc(4) B→aA(5) B→bB提取产生式(1)、(2)的左公共因子得:A→a(d|Ac)A→bBcB→aAB→bB 引进新非终结符A,去掉(,)后得G2为: (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 例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 由上面所举例子可以说明以下问题:① 不一定每个文法的左公共因子都能在有限的步骤内替换成无左公共因子的文法,上面文法G4就是如此。② 一个文法提取了左公共因子后,只解决了相同左部产生式右部的FIRST集不相交问题,当改写后的文法不含空产生式,且无左递归时,则改写后的文法是LL(1)文法,否则还需用LL(1)文法的判别方式进行判断才能确定是否为LL(1)文法。 2.消除左递归 设一个文法含有下列形式的产生式。1)A→A? A∈VN, ?∈V*2)A→B?B→A? A, B∈VN, ?, ?∈V*可称含1)中产生式的文法为含有左递归的规则或称直接左递归的。含2)中产生式的文法有A A … 则称文法中含有左递归或间接左递归,文法中只要含有1)或含有2)的产生式或二者皆有均认为文法是左递归的,然而,一个文法是左递归时不能采用自顶向下分析法。 例5.10 所能产生的语言L={ban|n≥0},对输入串baaaa#是该语言的句子,但用自顶向下分析时可看出当输入符为b时,为与b匹配则应选用S→b来推导,但这样就推不出后边部分,而若用S→Sa推导则出现右图的情况,无法确定到什么时候才用S→b替换 另一方面,用递归子程序法时,在处理S的过程中,没有对当前输入符号匹配就又进入递归调用处理S的过程,这样就会造成死循环。 文法G5含有直接左递归:S→SaS→b 例5.11 含有间接左递归的文法G6为: (1) A→aB (2) A→Bb (3) B→Ac (4) B→d 若有输入串为adbcbcbc#, a) 消除直接左递归
文档评论(0)