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

本文详细介绍了语法分析中的归约过程,包括移进归约和规范归约,并深入讲解了短语、直接短语和句柄的概念。接着讨论了算符优先分析法,定义了终结符之间的优先关系。进一步阐述了算符优先文法,以及构造FIRSTVT和LASTVT集合的方法。最后,重点解析了LR分析方法,包括LR分析器的栈结构、动作表和状态转换表,以及LR(0)和LALR分析表的构造。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第五章 语法分析——自下而上分析
一、知识点

归约是指根据文法的产生式规则,把产生式的右部替换成左部符号。

1移进归约:用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。

2规范归约

短语定义:令G是一个文法,S是文法的开始符号,假定abc是文法G的一个句型

其中α,b,∈(VN∪VT)*A∈VN ,如果有 “S*A A+ ”
则称babc句型相对于非终结符A的短语
注意: 因为句型是由开始符号推出来的,而短语是由非终结符号推出来的。所以,短语是句型的一部份或全部符号串。
直接短语如果有A-b,则称b是句型abc相对于规则A-b 的直接短语。
句柄一个句型的最左直接短语称为该句型的句柄。

 

1. ’#’的使用
(1)在分析开始时,将’#’预先进栈,作为栈底符号
(2)’#’作为输入串的结束符

2. 自左向右对输入串ω不断向栈中进行移进——归约,规约到开始符号

 

算符优先分析法

定义算符之间优先关系,借助这种关系来寻找“可归约串”和进行归约

定义两个终结符a’与‘b’的优先关系

a =.b   表示a的优先性等于b

a >.b   表示a的优先性大于b

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

注意:

 =.  >. <. 不同于数学上的 = < >

a =.b   不一定对应着 b =. a

a >.b   不一定对应着 b <. a

a <.b   不一定对应着 b >. a

(1) 算符文法 
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法,也称OG文法 (Operater Grammar)
约定:
ab代表任意终结符;
PQ、非终结符;
‘…’代表由终结R代表任意符和非终结符组成的任意序列,包括空字
(2)定义终结符之间的优先关系
假定G是一个不含产生式的算符文法。对于任何一对终结符ab,我们说:
1. a =. b 当且仅当文法G中含有形如P→…ab…P→…aQb…的产生式;
2. a <. b 当且仅当G中含有形如P→…aR…的产生式, 而R b…R Qb…
3. a>.b 当且仅当G中含有形如P→…Rb…的产生式,而 R …aR …aQ
(3)如果一个算符文法G中的任何终结符对(ab)至多只满足下述三关系之一:
a=.b
a>.b
a<.b
则称G是一个算符优先文法(OPG文法)

 

 

(1) 通过检查产生式的每一个候选式可以找出满足a=.b
(即P→…ab…P→…aQb…的产生式)
(2)为了满足<.>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)LASTVT(P)
(3)构造集合FIRSTVT(P)的算法
按其定义,可用下面两条规则来构造集合FIRSTVT(P)
若有产生式P→a…P→Qa…
aFIRSTVT(P)
aFIRSTVT(Q),且有产生式P→Q…
aFIRSTVT(P)

(4) 同理构造构造集合LASTVT(P)的算法
按其定义,可用下面两条规则来构造集合LASTVT(P)
若有产生式P→… aP→… aQ
a LASTVT(P)
a LASTVT(Q),且有产生式P→… Q
a LASTVT(P)
(5)有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<.>.的所有终结符对。
(1)假定有个产生式的一个候选形为 …aP… 那么,对任何bFIRSTVT(P),有a <. b
(2)假定有个产生式的一个候选形为 …Pb… 那么,对任何aLASTVT(P),有a >. b

 

LR分析方法

LR分析方法是一种自下而上的分析方法
LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程
LR分析方法是一种适用于一大类上下文无关文法的分析方法
比较复杂,不适于用手工实现,可借助于YACC/bison实现
根据归约过程中向前看输入符号串中字符的个数,定义不同的LR(k)分析方法,通常,k=01

1.LR分析器栈的结构_分析栈
(1)把历史和展望材料抽象成某些状态。分析栈用来存放这些状态。栈顶的状态都代表了整个历史和已经推测出的展望。
(2)为了有助于明确归约手续,将已归约出的文法符号串也同时放到栈里。
2.LR分析器栈的结构_动作表和状态转换表
动作表:
ACTION[sa]
当状态s面临输入符号a时,应采取什么动作
每一项ACTION[sa]所规定的四种动作:
<1>. 移进
<2>. 归约
<3>. 接受
<4>. 报错
状态转换表:
GOTO[sX]
状态s面对文法符号X时,下一状态是什么

<1>. 移进
(sa)的下一状态s’=GOTO[s,a] 和输入符号a推进栈,下一输入符号变成现行输入符号.
<2>. 归约
指用某产生式A进行归约. 假若的长度为r, 归约动作是A, 去除栈顶r个项,使状态sm-r变成栈顶状态,然后把(sm-r, A)的下一状态s’=GOTO[sm-r, A]和文法符号A推进栈.
<3>. 接受 宣布分析成功,停止分析器工作。
<4>. 报错 发现源程序含有错误,调用出错处理程序

活前缀

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

活前缀特点:
该前缀加上被分析串中未被分析的终结符,就可以构成一个规范句型
只要输入串的已扫描部分可归约成一个活前缀,意味着扫描过的部分没有错误

活前缀与句柄间的关系
(1)活前缀中已含有句柄的全部符号(句柄的符号即为其最右符号)
  这表明:此时某一产生式A→β的右部符号串β已出现在栈顶,因此相应的分析动作应当是用此产生式进行归约。
(2)活前缀中含句柄的一部分符号(句柄开头的 若干符号与活前缀最右的若干个符号一致)
  这表明形如A→β1β2的产生式的右部子串β1已出现在栈顶,正期待着从余留输入串中看到能由β2推出的符号串。
(3)活前缀中全然不包含句柄的任何符号 。
  第三种情况则意味着,期望从余留输入串中能看到由某一产生式A→α右部,即A所推出的符号串。

LR分析表的构造需要构造识别活前缀的有限自动机,
用有限自动机中的状态表示分析表中的状态,
用状态图中的状态之间的转换关系对分析表中的action goto函数等进行定义。

 

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

1)移进项目 A →a•ab2)待约项目 A →a•Bb3)归约项目 A →a• 4)接受项目 S’→S •

一个项目集可能包含多种项目

A)移进和归约项目同时存在。移进-归约冲突B)归约和归约项目同时存在。

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

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

LALR分析表的构造

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

JkI1I2I3…合并后的同心集,GOIX)也同心,因此定义GO函数为:GOTO[kA]=j,其中A为非终结符,j为某一状态号。
二、课后习题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值