- 1、本文档共86页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 LR分析法
第六章 LR分析法 特征: 规范归约 符号栈中的符号是规范句型的前缀,且不含句柄以后的任何符号(活前缀) 分析决策依据栈顶状态和现行输入符号 识别活前缀的 DFA. 优点: 适用范围广;分析速度快;报错准确。 构造分析器的工作量很大,不大可能手工构造;用软件工具yacc-Yet Another Compiler Compiler,Bell,1974. 四种分析法: LR(0) SLR(1) LR(1) LALR(1) LR驱动程序算法流程 6.2 LR(0)分析表的构造 LR(0)分析法不需要向前看符号就可以确定是归约(到哪个符号)还是移入。 适用于LR(0)文法 LR(0)文法能力最弱,理论上最重要 存在FA 识别活前缀 识别活前缀的DFA如何构造 (LR(0)项目集规范族的构造) LR(0)分析表的构造 拓广文法: 引入一新非终结符作为文法的新开始符, 添加一新产生式: S’→S :S’为新开始符,S为原来的开始符号。 拓展文法的目的: 使文法只有一个以识别符号作为左部的产生式,从而使构造出来的分析器有唯一的接受状态。 二、核心概念之一:LR(0)项目 为刻划分析过程中的文法G的每一个产生式的右 部符号已有多大一部分被识别(出现在栈顶) 的情况,分别用标有圆点的产生式来指示位置。 定义:在文法的每个产生式的右部添加一个圆点“?”,称为G的一个LR(0)项目(项目)。圆点是表示项目的一种标记。 项目的意义:用项目表示分析的进程。 作用:圆点表示识别一个产生式右部符号所到达的位置,已从输入串看到可由圆点左部推出的符号串,希望看到圆点右部推出的符号串。即在产生式右部加一园点以分割已获取的内容和待获取的内容:构成句柄。 活前缀,与句柄 ,与 LR(0)项目 移进项目或待归约项目A→.β 刻划没有句柄的任何符号在栈顶,此时期望A→β的右部所推出的符号串。 活前缀不含有句柄的任何符号。 移进项目或待归约项目A→β1.β2 刻划A→β1β2的右部子串β1已出现在栈顶,期待从输入串中看到β2推出的符号。 活前缀只含句柄的一部分符号。 归约项目A→β. 刻划产生式A→β的右部β已出现在栈顶。 活前缀已含有句柄的全部符号。 三、识别活前缀的确定有穷自动机 1.构造一个状态。 2.后继状态定义。 3.构造转移函数。 1.构造一个状态 -定义:设I是文法G的一个LR(0)项目集合,每个状态是一个项目集。closure(I)作为一个状态。 -closure(I)是从I出发用下面三个规则构造的项 目集: 1.I中每一个项目都属于closure(I)。 2.若项目A→α·Bβ?closure(I)且B→η?P 则将B →.η加进closure(I)中。 3.重复执行2直到closure(I)不再增大为止。 在closure(I)中的每个项目是等价的,即从期待归约的角度来看是相同的; 核:圆点不在产生式最左边的项目。除S’→·S。 初态:closure({S’→·S}):在开始的时候,我们考虑的是最后归约到识别符号时候使用的规则。所以猜测的可能性(项集)为:closure({S’→·S})。 用状态近似表示分析位置 分析位置对应多个 LR(0) 项目,状态应是 LR(0) 项目集合。 状态计算:从一个分割位置出发,考虑向前分析中可能处于同一分析位置的分割位置。 四、LR(0)分析表的构造 1.LR(0)项目集规范族的计算 2.LR(0)分析表的构造 1.LR(0)项目集规范族的计算 定义:识别活前缀的DFA项目集(状态)的全体称为LR(0)项目集规范族。 求法: 1)初态: closure({S’→·S}) 2)求出新状态, go(I,X)=closure(J) 其中I为已求出的状态 3)重复2)直到不出现新的状态集为止。 LR(0)项目族集 由算法构造出的是一个DFA,对状态图的说明: (1)每个DFA的状态是一个项目集,称作LR(0)项目集,整个状态集称LR(0)项目集规范族; (2)在DFA的任意项目集内,每个项目是等价的,指从期待归约的角度来看是相同的; (3)有一个唯一的初态和若干个终态,表示有若干种活前缀的识别状态; (4)活前缀的求法:从初始状态出发,沿着DFA可到达的状态的路的标记。 (5)状态反映了识别句柄的情况。 2.LR(0)分析表的构造 前提:该文法为LR(0)文法 输入:一个拓广文法G 。 输出:G’的分析表的action子表和goto子表。 方法: 1.构造C={I0,I1,I2,…In},G’的LR(0)项目集规范族,即识别活前缀的DFA。 2.对于状态k(在分析表中,我们用项目集Ik的下标k代表对应的状态)的分析动作如下: (a)若A→α·aβ属于
文档评论(0)