- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第二章 语法分析器构造
我们采用一种最为常用的语法分析器─LR分析器。LR分析器的构造主要是指上下文无关文法的自下而上分析程序的自动构造。从实践角度出发,我们采用手工方法来设计LR分析器。LR系指“自左向右扫描和自下而上进行归约”。大多数用上下文无关文法描述的程序语言都可用LR分析器予以识别。LR分析法在自左至右扫描输入串时就能发现其中的任何错误,并能准确地指出出错地点。
一个LR分析器包括两部分,一个总控(驱动)程序和一张分析表。注意,所有LR分析器的总控程序都是一样的,只是分析表各有不同。因此,产生器的主要任务就是产生分析表。
2.1 LR分析器基本知识
我们知道,规范归约(最左归约,即最右推导的逆过程)的关键问题是寻找句柄。LR方法的基本思想是:在规范归约过程中,一方面记住已移进和归约出的整个符号串,即记住“历史”;另一方面根据所用的产生式推测未来的可能碰到的输入符号,即对未来进行“展望”。当一串貌似句柄的符号串呈现于分析栈的顶端时,我们希望能够根据所记载的“历史”和“展望”以及“现实”的输入符号等三方面的材料,来确定栈顶的符号是否构成相对某一产生式的句柄。
一个LR分析器实质上是一个带先进后出存贮器(栈)的确定有限状态自动机。我们将把“历史”和“展望”材料综合地抽象成某些“状态”。分析栈(先进后出存贮器)用来存放状态。栈里的每个状态概括了从分析开始直到某一归约阶段的全部“历史”和“展望”资料。任何时候,栈顶的状态都代表了整个的历史和已推测出的展望。LR分析器的每一步工作都是由栈顶状态和现行输入符号所唯一决定的。为了有助于明确归约手续,我们把已归约出的文法符号串也同时放在栈里。于是,栈的结构可看成图2-1所示的结构。 TOP
sm Y sm-1 X .
.……
.
…… s0 #
图2-1 分析栈示意
栈的每一项内容包括状态s和文法符号X两部分。(sO,#)为分析开始前预先放入栈里的初始状态和句子括号。栈顶状态为sm,符号串X1X2…Xm是至今已移进归约出的文法符号串。
LR分析器的核心部分是一张分析表。这张分析表包括两部分:一是“动作”(ACTION)表,另一是“状态转换”(GOTO)表。它们都是二维数组。ACTION[s,a]规定了当状态s面临输入符号a时应采取什么动作。GOTO[s,X]规定了状态s面对文法符号X(终结符或非终结符)时下一状态是什么。显然,GOTO[s,X]定义了一个以文法符号为字母表的DFA(确定有限自动机)。
每一项ACTION[s,a]所规定的动作不外是下述四种可能之一:
(1)移进:把(s,a)的下一状态s′=ACTION[s,a]和输入符号a推进栈(对终结符a,GOTO[s,a]的值已放入ACTION[s,a]中),下一输入符号变成现行输入符号。
(2)归约:指用某一产生式A→β进行归约。假若β的长度为γ,归约的动作是去掉栈顶的γ个项,使状态sm-γ变成栈顶状态,然后把(sm-γ,A)的下一状态s′=GOTO[sm-γ,A] 和文法符号A推进栈。归约动作不改变现行输入符号。执行归约的动作意味着呈现于栈顶的符号串Xm-γ+1…Xm是一个相对于A的句柄。
(3)接受:宣布分析成功,停止分析器的工作。
(4)报错:报告发现源程序含有错误,调用出错处理程序。
LR分析器的总控程序本身的工作是非常简单的,它的任何一步只需按栈顶状态s和现行输入符号a执行ACTION[s,a]所规定的动作。不管什么分析表,总控程序都是一样地工作。
我们主要关心的问题是如何从文法构造LR分析表。对于一个文法,如果能够构造一张分析表,使得它的每个入口均是唯一确定的,则我们将把这个文法称为LR文法。对于一个LR文法,当分析器对输入串进行自左至右扫描时,一旦句柄呈现于栈顶,就能及时对它实行归约。
一个LR分析器有时需要“展望”和实际检查未来的K个输入符号才能决定应采取什么样的“移进-归约”决策。一般而言,一个文法如果能用一个每步顶多向前检查K个输入符号的LR分析器进行分析,则这个文法就称为LR(k)文法。
对于一个文法,如果它的任何“移进-归约”分析器都存在如下的情形:尽管栈的内容和下一个输入符号都已了解,但无法确定是“移进”还是“归约”;或者,无法从几种可能的归约中确定其一;那么这个文法就是非LR(1)的。注意,LR文法肯定是无二义的,一个二义文法决不会是LR的。但是,LR分析技术可修改为适用于分析一定的二义文法。
2.2 LR(0)分析表的构造
我们希望仅由一种只概括“历史”资料而不包含推测性“展望”材料的简单状态就能识别呈现在栈顶的某些句柄,而LR(0)项目集就是这样一种简单状态。
在讨论LR分析法时,需要定义一
文档评论(0)