第5讲--语法分析下.pptVIP

  1. 1、本文档共75页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第5讲--语法分析下

第五讲 语法分析(下);内容提要; 前面已经谈了自下而上分析的基本思想,就是自左而右地扫描输入——源程序单词符号串,并逐步进行自下而上的归约,直至规约到文法的开始符号;或者说,从树的末端开始,一步步向上归约,直至树根。这种构造树的过程与我们通常的从根开始构造的方法刚好是一个逆过程,因此这种树又称为语法分析树。;1.归约与语法分析树 上述思想可用如下的一个例子来说明: 例 文法 G[S]: (1)S→aAcBe (2)A→b (3)A→Ab (4)B→d 显然,abbcde是该文法的一个句子,于是可如右构造其语法分析树:;2.移进-归约 在计算机上模拟以上的语法分析树的构造过程,可借助于一个符号栈来实现:;分析方法的基本思想; 为了寻找可归约串,先来看两个定义: (1)短语、直接短语和句柄: 令G是一个文法,S是开始符号,αβδ是文法G的一个句型,如果有 S ?* αAδ且A ?+β, 则称β是句型αβδ相对于非终结符A的短语。 特别的,如果有A ?β,则称β是句型αβδ相对于规则A→β的直接短语,一个句型的最左直接短语称为该句型的句柄。;8; 接下来我们介绍一种强大的自下而上语法分析技术,它可用于大多数CFG的语法分析,称为LR分析法。L表示从左至右扫描输入串,R表示构造一个最右推导的逆过程。 LR分析法比其他的“移进-归约”法更加广泛,效率也不比它们差;比一般不带回溯的自上而下分析(如LL(1)分析)也要好一些,而且在自左而右扫描输入串时就能发现其中的任何错误,并能准确地指出出错位置。 当然,要适应一般情况,分析器就得更加复杂。因此,LR分析器的手工构造工作量相当大,一般要借助于自动产生器。; 1.LR分析器 (1)概述: 根据前面的介绍我们知道:自下而上分析的中心思想是“移进-归约”,关键问题就是“寻找规范句型的句柄”。当一貌似句柄的符号串呈现于分析栈顶时,如何确定用哪一个产生式来归约?这是我们一直未能解决的问题。 仔细分析问题产生的原因,我们会发现,在分析过程中我们没有利用到已处理的过程—“历史资料”,也没有根据产生式去“瞻望”未来可能遇到的输入符号,而LR分析法就是在这些方面对“移进-归约”进行改造的。 LR分析法的基本思想:根据“历史资料”、“现实输入符号”以及对未来的“展望”等三个方面来确定栈顶的符号是否构成了相对于某一产生式的句柄。它是由Knuth在1965年首先提出的,后经Aho等人改造而成。; ①一个LR分析器实际上是一个带有分析栈的DFA 前面讲过,状态的变化可以反映出处理前后的经过,因此这儿我们应把“历史”和“展望”材料都综合为“状态”,存入分析栈,使得任何时候,栈顶都代表了从分析开始以来的全部“历史”和已推测出的“展望”。这样一来,在任何时候都可从栈顶来了解一切,栈顶状态和现行输入符号就唯一决定了LR分析器的每一步工作。 栈中每一项内容包括状态s和文法符号X两部分。栈的初始值为(s0,#)。栈顶状态为sm,符号串X1X2…Xm是至今已移进归约出的部分。 如下图所示:;s0; ②分析表 LR分析器的核心是一张分析表。这张表包括两部分:“动作”(Action)和“状态转换”(Goto) ,它们都是二维数组。Action[s,a]规定了状态s面临输入符号a时应该采取什么动作;Goto[s,X]则指出状态s面对文法符号X(终结符或非终结符)时下一状态是什么。显然,Goto[s,X]定义了一个以文法符号为字母表的DFA。 ; 每一项Action[s,a]所规定的动作无非是下述四种可能之一: a.移进:把(s,a)的下一状态s=Goto[s,a]和输入符号a推进栈,下一输入符号变成现行输入符号; b.归约:指用某一产生式A→β进行归约。若|β|=r,则把栈顶r个项托出,栈顶状态变成sm-r,然后把 (sm-r,A)的下一状态s=Goto[sm-r,A]和A进栈。归约动作不改变现行输入符号;(这意味着Xm-r+1 …Xm=β是一个相对于A的句柄) c.接受:宣布分析成功,停止分析器的工作; d.报错:报告发现错误,调用出错处理程序—扫描输入串就可以发现错误位置。; ③LR分析器的工作过程: 一个LR分析器的工作过程可以看成是栈里的状态序列、已归约串和输入串所构成的三元式的变化过程: 初始三元式: (s0, #, a1a2…an#) 中

文档评论(0)

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

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

1亿VIP精品文档

相关文档