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

       在上一章里面学习了自上而下的分析方法识别句子的正确性,这一章学习的是自下而上的分析方法,综合来讲这两章讲的就是语法分析。自下而上的分析方法利用一进规约的基本思想,也就是用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。

       一、基础知识

       1.1短语

               

则贝塔称是句型相对于非终结符A的短语。

        注意:短语是句型的一部份或全部符号串。

      1. 2.直接短语

            特别是,如果有,则称是句型相对于规则的直接短语。

     1.3.句柄

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

    1.4.规范规约

        规范归约是关于是一个最右推导的逆过程。

        由于规范句型由最右推导推出的句型,故该句型的句柄右边只含有终结符号。

     2.1算符优先分析法

        2.1.1  定义两个终结符‘a’与‘b’的优先关系
        a =.b   表示a的优先性等于b
        a >.b   表示a的优先性大于b

        a <.b   表示a的优先性小于b 

        注意:反之不一定成立

        2.1.2算符文法

一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,则我们称该文法为算符文法,也称OG文法 。

2.1.3终结符之间的优先关系



2.1.4算符优先文法(OPG)

         如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一:
a=.b
a>.b
a<.b

        则称G是一个算符优先文法

2.1.5构造算符优先关系表

    (1)通过检查产生式的每一个候选式可以找出满足a=.b(即P→…ab…或P→…aQb…的产生式)

  (2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):



(3)构造集合FIRSTVT(P)的算法
按其定义,可用下面两条规则来构造集合FIRSTVT(P):


① 若有产生式P→a…或P→Qa…,
则aFIRSTVT(P);


② 若aFIRSTVT(Q),且有产生式P→Q…,

则aFIRSTVT(P)。

(4)同理构造构造集合LASTVT(P)的算法
按其定义,可用下面两条规则来构造集合LASTVT(P):


① 若有产生式P→… a或P→… aQ ,
则a LASTVT(P);


② 若a LASTVT(Q),且有产生式P→… Q ,
则a LASTVT(P)。

 (5)有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<.和>.的所有终结符对。
1)假定有个产生式的一个候选形为
…aP…

  那么,对任何bFIRSTVT(P),有a <. b。

2)假定有个产生式的一个候选形为
…Pb…
  那么,对任何aLASTVT(P),有a >. b。

2.1.6算符优先分析算法的设计

素短语

指一个句型的短语,它至少包括有一个终结符号且除去它本身之外不再含任何更小的素短语

最左素短语

处在句型最左端那个素短语成为最左素短语

3 LR分析法

LR分析器
LR(0)分析表的构造
项目、项目集、项目集规范族
项目集的闭包(closure)

有效项目

LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程


3.1LR分析器栈的结构_动作表和状态转换表

动作表:
ACTION[s,a]:

当状态s面临输入符号a时,应采取什么动作

                 每一项ACTION[s,a]所规定的四种动作:
                 <1>. 移进
                 <2>. 归约
                 <3>. 接受
                 <4>. 报错



状态转换表:
GOTO[s,X]:

状态s面对文法符号X时,下一状态是什么

3.2LR文法

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

我们最感兴趣的是k=0,1

存在移进、归约冲突的文法是非LR文法结构

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

活前缀

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

LR(0)项目


我们把右部某位置上标有圆点的产生式称为相应文法的一个LR(0)项目,特别对形如A→ε的产生式,A→·。

文法的全部LR(0)项目将是构造识别它的所有活前缀的有限自动机的基础。

构造识别活前缀的NFA

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

状态之间的转换关系确定方法如下:

若项目i为X→X1X2...Xi-1 • Xi…Xn。
  项目j为X→X1X2...Xi-1Xi • Xi+1…Xn。
 则从状态i到状态j连一条标记为Xi的箭弧。


项目集规范族

构成识别一个文法活前缀的DFA项目集(状态)的全体称为这个文法的LR(0)项目集规范族。

项目集的闭包

通过闭包函数(CLOSURE)来求DFA一个状态的项目集。

构造G的拓广文法G

设S为文法G的开始符号,构造一个文法G’,它包含整个文法G,并且引进了一个不出现在G中的非终结符S,并加进一个新产生式S→S,这个S是G的开始符号。把G’成为G的拓广文法。(有一个仅含项目S→S. 的状态,这就是唯一的“接受”状态)

I的闭包CLOSURE(I)

(1)  I的任何项目都属于CLOSURE(I);
(2)  若A→·B属于CLOSURE(I),那么,对任何关于B的产生式B→的项目B→·也属于CLOSURE(I);

(3)  重复执行上述两步骤直至CLOSURE(I) 不再增大为止

定义转换函数如下:
GOTO(I,X)=CLOSURE(J)其中:
I为包含某一项目集的状态,
X为一文法符号,

J={任何形如A→X•的项目|A→•X属于I}。

识别文法G(S)全部活前缀的DFA

文法G的全部项目集为I0--I11。我们将这些项目集的全体称为文法G的LR(0)项目集规范族。C={I0,I1,…,I11}

DFA为:M=(C,V,GO,I0,C)

LR(0)项目集规范族的项目类型分为如下四种:

       1)移进项目 A →•a
  2)待约项目 A →•B
  3)归约项目 A →• 
  4)接受项目 S’→S • 


LR(0)分析表的构造

LR(0)项目集规范族不存在移进-归约,或归约-归约冲突,称为LR(0)文法。

  只有是LR(0)文法,才能构造相应的LR(0)分析表,才能用LR(0)分析法对句子进行分析。

SLR 分析表的构造

大多数程序设计语言的文法不能满足 LR(0)文法的条件,即其规范族中会有含有冲突的项目集(状态)。

对于有冲突的状态,向前查看一个符号,以确定采用的动作。

1)若a=b,则移进。
  2)若aFOLLOW(A),则用产生式A→进行归约。
  3)若aFOLLOW(B),则用产生式B→进行归约。

  4)此外,报错。

LALR分析表的构造

1 构造文法G的LR(1)项目集族
2 合并同心集
3 构造action 表:
a)若项目[A→•a,b]属于Ik,且转换函数GO(Ik,a)=Ij,当a为终结符时 ,则置ACTION[k,a]为Sj。
b)若项目[A→•,a]属于Ik, 则置ACTION[k,a]=rj, j为产生式在文法G′中的编号。
C)若[s’->.s, #]属于Ik,则置ACTION[k,#]接受
4 goto表的构造:

若Jk是I1I2I3…合并后的同心集,GO(I,X)也同心,因此定义GO函数为:GOTO[k,A]=j,其中A为非终结符,j为某一状态号。



课后题





总结:

      在这一章的学习中,感觉只是什么的有些杂乱,并不知道应该怎么整理,有些感觉在脑子里想一想好像并不知道学了什么,现在再想想的话,然后我就先做了一个课后题,根据题中不会的去找了相对应的理论,这一章学了自下而上的归约方法,这才可以通过找对应的直接短语来进行从一个句子到开始符号的归约,后来学的最终的就是通过LR(0)文法构造DFA,找到I1状态,通过goto函数找到对应的其他状态,整合形成项目集,然后根据项目集之间的转化形成DFA,这要比从nfa转化成DFA要简单很多这就大体上是我们这一张所学习的内容,总体上,感觉这一章的小知识很多是,有些碎,但是把知识点都归纳完之后也就能发现知识点之间都有联系,可以比较容易的记住,都是一些流程性的东西,主要还是靠记忆和大量的计算吧,这就要求记得东西比较多了。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值