编译原理(清华)第七章LR分析法.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章 LR分析法 学习目标: 掌握:LR(0)分析,SLR(1)分析 理解:活前缀,可归前缀 了解:LR(1)、LALR(1)分析思想 7.1 LR分析概述 7.2 LR(0)分析 7.3 SLR(1)分析 7.4 LR(1)、LALR(1)分析思想 回顾:自底向上分析实现的基本思想——“移进-归约”方法 (1) S→aAcBe(2)???A→b (3)???A→Ab(4) B→d 判断输入串 abbcde# 是否为该文法的句子 7.1 LR分析概述 LR分析法: 根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K个(K=0)符号就可唯一地确定句柄。 LR(K)的含义: L表示从左到右扫描输入串 R表示最左规约(即最右推导的逆过程) K表示向右查看输入串符号的个数 当K=1时,能满足当前绝大多数高级语言编译程序的需要,所以着重介绍LR(0),SLR(1),LR(1),LALR(1)方法 LR分析的特点: 是规范归约 适用范围广,适用于大多数上下文无关文法描述的语言 分析速度快,能准确定位错误 缺点:LR分析器的构造工作量大 LR分析器的组成 总控程序:所有LR分析器总控程序相同。 分析表: 不同文法有不同的分析表 同一文法采用的LR分析器不同,分析表也不同 分析表分为ACTION表(动作表)和GOTO表(状态转换表)。 分析栈: 包括状态栈S和文法符号栈X。 分析表是LR分析器的核心 LR分析表: 列标题为状态,行标题为文法符号 ACTION表中的动作有4种: 移进(Sk): 把状态k移入状态栈,若当前状态是i,且k=GOTO[i,a],把a移入符号栈 归约(rk): 用第k条产生式进行归约,此时栈顶形成了句柄β,文法中第k条产生式为A-β,且|β|=r,归约时从状态栈和符号栈中弹出r个符号,把A移入符号栈,j=GOTO[i,A]移入状态栈,其中状态i为修改指针后的栈顶状态 接受(acc): 当符号栈只剩文法开始符S,并且当前输入符为‘#’,则分析成功 报错: 当状态栈顶的状态遇到了不应该出现的文法符号,则报错,说明输入串不是该文法的句子 LR分析器的工作过程示意图 7.2 LR(0) 分析 使用LR(0)分析表的LR分析器称为LR(0)分析器。 LR(0)分析器在分析的过程中只根据符号栈的内容就能确定句柄,不需要向右查看输入符号 对文法的限制较大,对绝大多数高级语言的语法分析器不适用 构造LR(0)分析表的思想和方法是构造其他LR分析表的基础。 例 文法: (1) S→aAcBe(2)???A→b(3)???A→Ab(4) B→d 判断输入串 abbcde# 是否为该文法的句子 LR(k)分析法通过活前缀来帮助确定句柄 规范句型的可归约前缀和活前缀(7.2.1) 构造文法的识别活前缀及可归前缀的DFA(7.2.2,7.2.3) 按DFA构造相应分析表——状态转换表和动作表(7.2.4) 按分析表进行LR(k)分析(7.2.5) 7.2.1 规范句型的可归约前缀和活前缀 什么是可归前缀? 什么是活前缀? 可归前缀和活前缀在LR分析中起什么作用? 前缀 如果Z=xy是一符号串,则x是Z的前缀,其中x,y为任意符号串(包括空串ε ) 例:abc的前缀有ε,a,ab,abc。 可归前缀 规范句型中句柄之前包括句柄在内的串称为可归前缀。 例:文法G[S],其中产生式后[i]是其编号 S→aAcBe[1] A→b[2] A→Ab[3] B→d[4] 输入串abbcde 的最右推导(规范推导)过程: S=aAcBe[1] = aAcd[4]e[1]=aAb[3]cd[4]e[1]= ab[2]b[3]cd[4]e[1] 最左归约(规范归约)过程: ab[2]b[3]cd[4]e[1] 用产生式[2]归约 ├ aAb[3]cd[4]e[1] 用产生式[3]归约 ├ aAcd[4]e[1] 用产生式[4]归约 ├ aAcBe[1] 用产生式[1]归约 ├ S 可归前缀有:ab[2],aAb[3],aAcd[4],aAcBe[1] 活前缀 定义: 形成可归前缀之前(包括可归前缀在内)的所有规范句型(符号栈内部分)的前缀称为活前缀。即规范句型的不含句柄右边符号的前缀称为活前缀。 ? 例:规范句型 aAbcde (下划线为句柄)的可归前缀为aAb,活前缀为:ε,a,aA,aAb 可归前缀和活前缀在LR分析中的作用 在LR分析过程中,实际上是把活前缀列出放在符号栈中, 一旦在栈中出现可归前缀,即句柄已经形成,就用相应的产生式进行归约, 在分析的过程中,只要符号栈中的符号串是一个活前缀,就可保证已被分析过的部分是该文法规范句型的正确部分。 7.2.2 识别活

文档评论(0)

xinshengwencai + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:5311233133000002

1亿VIP精品文档

相关文档