第五章语法分析---自下而上分析

一:知识点总结

自下而上分析法是从输入串开始,逐步进行”规约“,直至规约到文法的开始符号;或者说,从语法树的末端开始,步步向上”规约“,直至根结。

Ⅰ、归约

1、短语:令G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有S=*>αAδ,且S=+>β,则称β是句型αβδ相对于非终结符的短语。

2、直接短语:特别是,如果有A=>β,则称β是句型αβδ相对于规则的A->β的直接短语。

3、句柄:一个句型的最左直接短语称为该句型的句柄。

4、规范归约:假定α是文法G的一个句子,我们称序列αn,αn-1,......,α0是α的一个规范归约,如果此序列满足(1)α0=α;(2)α0为文法的开始符,即α0=S;(3)对任何i,0<i<=n,αi-1是从αi经把句柄替换为相应产生式的左部符号而得到的。从而可以得到,规范归约是关于α的一个最右推导的逆过程,因此,规范归约也成为最左归约。形式语言中。最右推导常被称为规范推导。

Ⅱ、算符优先分析

1、优先级关系:两个相继出现的终结符a和b(他们之间可能插有一个非终结符)的优先关系可能有三种:

①、a<•b(a的优先级低于b)②、a=•b(a的优先级等于b)③、a•>b(a的优先级高于b)【谁在前优先级低

注意:a<•b并不意味着b•>a,a=•b也不一定意味着b=•a。

2、算符文法:一个文法,如果它的任一产生式的右部都不含有两个相继(并列)的非终结符,即不含如下形式的产生式右部:...QR...,则我们称该文法为算符文法。

3、算符优先文法:如果一个算符文法G中的任何终结符对(a,b)至多只满足三种优先级关系之一,则称G为算符优先文法。

4、最左素短语:素短语是至少包含一个终结符,并且,除它自身之外不再含任何更小的素短语。那么最左素短语是指处于句型最左边的那个素短语。

Ⅲ、LR分析法

1、LR分析器

(1)、规范规约(最左规约-最右推导的逆过程)的关键问题是寻找句柄。

(2)、LR方法的基本思想是,在规范归约的过程中,一方面记住已移进和归约出的整个符号串;另一方面根据所用的产生式推测未来可能碰到的输入符号。

  (3)、LR分析器的核心部分是一张分析表。这张分析表包括两部分:一是“动作”(ACTION)表,另一是“状态转换”(GOTO)表。ACTION【s,a】规定了当状态s面临输入符号a时,应采取什么动作。每一项ACTION[s,a]所规定的四种动作不外是下述四种之一: 移进、归约、接受、报错。GOTO[s,X]规定了状态s面对文法符号X时,下一状态是什么。显然GOTO[s,X]定义了一个以文法符号为字母表的DFA。

   (4)、LR分析器工作过程:

第一步  分析开始时,首先将初始状态SO及句子左界符#推入分析栈中。

第二步  设在分析的某一步,分析栈及余留的输入符号串可表示为((0S1S2...Sm/#X1X2...Xm )aiai+1...an#)。 则以栈顶的状态及正扫视的输入符号ai组成符号对(Sm,ai)去查分析动作表,并根据表元ACTION[Sm,ai]的指示完成相应的分析动作。

第三步  重复上述第二步的工作,直到在分析的某一步,栈顶出现“接受状态”或“出错状态”为止。

    (5)、LR文法:一个文法,如果能构造出一个所有条目都唯一的分析表。LR(k)文法:最多向前看K个的符号就可以决定动作的LR分析器所分析的文法成为LR(k)文法。一般研究的是LR(0)、LR(1)。

2、LR(0)项目集族和分析表的构造

(1)、活前缀:文法G的活前缀是他的规范句型的前缀,该前缀不超过句柄的右端。

活前缀与句柄间的关系:活前缀中已含有句柄的全部符号(句柄的符号即为其最右符号);活前缀中含句柄的一部分符号(句柄开头的 若干符号与活前缀最右的若干个符号一致);活前缀中全然不包含句柄的任何符号 。

(2)、构造识别活前缀的NFA

1、构造文法的所有产生式的项目,每个项目都为NFA的一个状态。2、确定初态、句柄识别态、句子识别态。①由于S′(起始符)仅在第一产生式的左部出现 ,因此规定起始符相关的项目1为初态 。②其余每个状态都为活前缀的识别态(终态)。③圆点在最后的项目为句柄识别态 。④第一个产生式的句柄识别态为句子识别态 。

构成识别一个文法活前缀的DFA项目集(状态)的全体称为这个文法的LR(0)项目集规范族。LR(0)项目集规范族的项目类型分为如下四种:1)移进项目 A →α•aβ 。2)待约项目 A →α•Bβ。3)归约项目 A →α• 。4)接受项目 S‘→S • 。

(3)LR(0)分析表的构造

LR(0)分析表相当于识别活前缀的有限自动机DFA的状态转换矩阵。LR(0)分析表的构造算法。

3、SLR分析表

大多数程序设计语言的文法不能满足 LR(0)文法的条件,即其规范族中会有含有冲突的项目集(状态)。对于有冲突的状态,向前查看一个符号,以确定采用的动作。

4、规范LR分析表

仍有许多文法构造的LR(0)项目集规范族存在的动作冲突不能用SLR(1)方法解决。

LR(1)项目:构成:LR(1)项目[A→α•Bβ,abc…] (搜索符号)

搜索符号的作用:搜索符号仅对归约项目有效。当输入串中的符号和搜索符号相同时,才进行归约。搜索符号可以有多个,一般只关心一个,又称为LR(1)项目。

二:课后习题


三、总结:

本章内容比较复杂,知识点概念较多,主要学习了归约和符号栈的使用,符号优先级问题,重点学习了LR(0)分析法和LR(1)的情况,识别活前缀与确定有限自动机DFA。需要多花时间去理解去记忆做题的时候只要理解了并不困难,但是比较复杂,步骤较多,需要时刻细心与比对。

猜你喜欢

转载自blog.csdn.net/xinqi_789/article/details/80327285