编译原理实验2

编译原理实验2

ID:20388735

大小:249.50 KB

页数:17页

时间:2018-10-13

编译原理实验2_第1页
编译原理实验2_第2页
编译原理实验2_第3页
编译原理实验2_第4页
编译原理实验2_第5页
资源描述:

《编译原理实验2》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第二章语法分析器构造我们采用一种最为常用的语法分析器─LR分析器。LR分析器的构造主要是指上下文无关文法的自下而上分析程序的自动构造。从实践角度出发,我们采用手工方法来设计LR分析器。LR系指“自左向右扫描和自下而上进行归约”。大多数用上下文无关文法描述的程序语言都可用LR分析器予以识别。LR分析法在自左至右扫描输入串时就能发现其中的任何错误,并能准确地指出出错地点。一个LR分析器包括两部分,一个总控(驱动)程序和一张分析表。注意,所有LR分析器的总控程序都是一样的,只是分析表各有不同。因此,产生器的主要任务就是产生分析表。2.1LR分析器基本知识我们知道,规范归约(最左归约,即最右推导的

2、逆过程)的关键问题是寻找句柄。LR方法的基本思想是:在规范归约过程中,一方面记住已移进和归约出的整个符号串,即记住“历史”;另一方面根据所用的产生式推测未来的可能碰到的输入符号,即对未来进行“展望”。当一串貌似句柄的符号串呈现于分析栈的顶端时,我们希望能够根据所记载的“历史”和“展望”以及“现实”的输入符号等三方面的材料,来确定栈顶的符号是否构成相对某一产生式的句柄。一个LR分析器实质上是一个带先进后出存贮器(栈)的确定有限状态自动机。我们将把“历史”和“展望”材料综合地抽象成某些“状态”。分析栈(先进后出存贮器)用来存放状态。栈里的每个状态概括了从分析开始直到某一归约阶段的全部“历史”和

3、“展望”资料。任何时候,栈顶的状态都代表了整个的历史和已推测出的展望。LR分析器的每一步工作都是由栈顶状态和现行输入符号所唯一决定的。为了有助于明确归约手续,我们把已归约出的文法符号串也同时放在栈里。于是,栈的结构可看成图2-1所示的结构。TOPsmYsm-1X..…….……s0#图2-1分析栈示意栈的每一项内容包括状态s和文法符号X两部分。(sO,#)为分析开始前预先放入栈里的初始状态和句子括号。栈顶状态为sm,符号串X1X2…Xm是至今已移进归约出的文法符号串。20LR分析器的核心部分是一张分析表。这张分析表包括两部分:一是“动作”(ACTION)表,另一是“状态转换”(GOTO)表。

4、它们都是二维数组。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→Page:5β进行归约。假若β的长度为γ,归约的动作是去掉栈顶的γ个项,使

5、状态sm-γ变成栈顶状态,然后把(sm-γ,A)的下一状态s′=GOTO[sm-γ,A]和文法符号A推进栈。归约动作不改变现行输入符号。执行归约的动作意味着呈现于栈顶的符号串Xm-γ+1…Xm是一个相对于A的句柄。(3)接受:宣布分析成功,停止分析器的工作。(4)报错:报告发现源程序含有错误,调用出错处理程序。LR分析器的总控程序本身的工作是非常简单的,它的任何一步只需按栈顶状态s和现行输入符号a执行ACTION[s,a]所规定的动作。不管什么分析表,总控程序都是一样地工作。我们主要关心的问题是如何从文法构造LR分析表。对于一个文法,如果能够构造一张分析表,使得它的每个入口均是唯一确定的,

6、则我们将把这个文法称为LR文法。对于一个LR文法,当分析器对输入串进行自左至右扫描时,一旦句柄呈现于栈顶,就能及时对它实行归约。一个LR分析器有时需要“展望”和实际检查未来的K个输入符号才能决定应采取什么样的“移进-归约”决策。一般而言,一个文法如果能用一个每步顶多向前检查K个输入符号的LR分析器进行分析,则这个文法就称为LR(k)文法。对于一个文法,如果它的任何“移进-归约”分析器都存在如下的情形:尽管栈的内容和下一个输入符号都已了解,但无法确定是“移进”还是“归约”;或者,无法从几种可能的归约中确定其一;那么这个文法就是非LR(1)的。注意,LR文法肯定是无二义的,一个二义文法决不会是

7、LR的。但是,LR分析技术可修改为适用于分析一定的二义文法。2.2LR(0)分析表的构造我们希望仅由一种只概括“历史”资料而不包含推测性“展望”材料的简单状态就能识别呈现在栈顶的某些句柄,而LR(0)项目集就是这样一种简单状态。在讨论LR分析法时,需要定义一个重要概念,这就是文法的规范句型的“活前缀”。字的前缀是指该字的任意首部,例如字abc的前缀有ε、a、ab或abc。所谓活前缀是指规范句型的一个前缀,这种前缀不含句柄

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。