编译原理第4章语法分析自下而上lr分析法.ppt

编译原理第4章语法分析自下而上lr分析法.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理第4章语法分析自下而上lr分析法

4.3 LR分析法 一个LR分析器实质上是一个带先进后出存储器(栈)的确定有限状态自动机。 我们将把“历史”和“展望”材料综合地抽象成某些“状态”(自动机)。 分析栈(先进后出存储器)用来存放状态。栈里的每个状态概括了从分析开始直到某一归约阶段的全部“历史”和“展望”资料。 任何时候,栈顶的状态都代表了整个的历史和已推测出的展望。因此,在任何时候都可从栈顶状态得知所想了解的文法的一切信息,而没有必要从底而上翻阅整个栈。 LR分析器的每一步工作都是由栈顶状态和现行输入符号所唯一决定的。 2. 句型分析过程 设所给输入串为#i*i+i#,则总控程序分析此输入串的过程,如表4-11所示,通过分析,说明i*i+i是文法例4.4的句子。 例 利用上述分析表,假定输入串为 i * i + i ,描述LR分析器的工作过程。 存在不是LR的上下文无关文法 若一个文法的任何“移进-归约”分析器都存在下 述情况: 尽管栈的内容和下一输入符都已了解, 但仍无法确定是“移进”还是“归约”, 或无法从几种可能的归约中确定其一, 则该文法为非LR文法。 注意: (1) LR文法肯定是无二义的, 一个二义文法不会是LR文法。 (2) LR分析技术可适当修改以适于一定的二义文法。 称为活前缀原因:在右边增添一些终结符号就可以使它成为一个规范句型。 在LR分析工作过程中的任何时候,栈里的文法符号(自栈底而上)X1X2...Xm应该构成活前缀,把输入串的剩余部分配上之后即应成为规范句型(如果整个输入串确实构成一个句子)。 因此,只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部分没有错误。 可将文法的LR(0)项目分成如下四类: A→α· 归约项目 S→α· 接收项目,其中,S是开始符号 A→α·aβ 移进项目,其中,a∈VT A→α·Bβ 待归约项目,其中,B∈VN 识别例4.5的文法的句型“acd”的过程 先构造识别句型的活前缀NFA M,然后确定化太繁琐,下面给出一种直接构造DFA M的方法 定义 4.13 设I为LR(0)项目集,X是一文法符号,LR(0)状态转换函数GO(I,X)的定义如下: GO(I,X)=Closure(J) 其中: J={任何形如A→αX·β的项目|A→α·Xβ∈I} 文法(1) S→E (2) E→aA (3) A→cA (4) A→d 若S→· E∈I,则Closure(I)={ S→· E,E→· aA}, 令I0={ S→·E,E→·aA},则 GO(I0,E)={ S→E·}=I1 GO(I0,a)={ E→a·A,A→·cA,A→·d}=I2 从项目集I0开始,将I0定义成一个状态,按照状态转换函数GO(I,X)的定义可以找出所有的项目集(状态),由GO(I,X)所产生的项目集(状态)全体称为LR(0)项目集规范族。 构造一个G‘,它包含了整个G,但它引进了一个不出现在G中的非终结符S’,并加进一个新产生式S‘→S,而这个S’是G‘的开始符号。称G’是G的拓广文法。 把文法G进行拓广为了使“接受”状态易于识别,有一个仅含项目S→S的状态,这就是唯一的“接受”态。 构造LR(0)项目集规范族的 例如,文法G为: S→aBC B→b C→c 拓广文法G为: (1)S→S (2)S→aBC (3)B→b (4)C→c 句子“abc”的规范归约过程如下: abc,aBc,aBC,S,S‘ 运用图识别输入串“abc”的过程 有效项目(课本P86类似) 项目A? ?1.?2对活前缀??1是有效的,存在规范推导 文法G(S?) S?→E E→aA|bB A→cA|d B→cB|d 考虑: 项目:B ? c.B B ? . cB B ? . d 活前缀:bc S’? E ? bB ? bc.B (项目B ? c.B) S’? E ? bB ? bcB ?bccB (项目B ? . cB) S’? E ? bB ? bcB ? bcd (项目B ? . d) 例: 按上表对acccd进行分析 步骤 状态栈 符号栈 输入串 1 0 # acccd# 2 02 #a cccd# 3 024 #ac ccd# 4 0244 #acc cd# 5 02444 #accc d# 6 0244410 #acccd # 7 024448 #acccA # 8 02448 #accA # 9 0248 #acA # 10

文档评论(0)

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

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

1亿VIP精品文档

相关文档