自下而上语法分析
1自下而上概述
1)从分析树的底部(叶节点)向顶部(根节点)方向构造分析树
2)可以看成是将输入串w归约为文法开始符号S的过程
3)自上而下的语法分析采用最左推导方式,自底向上的语法分析采用最左归约方式
1.1短语和直接短语
什么是可归约串? 答:短语。
什么是短语呢?短语是连续出现且能构成一定的语法单位, 下图中,蓝色框中是短语,但是红色框中不是。

短语的定义:

第一个式子表示,非终结符A和这个短语
β
\beta
β的上下文一起仍然是一个句型,也依然能构造出一个语法树。
第二个式子表示,连续的单词序列可以向上归约成一个非终结符上面去,比如上图中“the” "student"可以完整归约到“NP”
直接短语:第二个式子中的
β
\beta
β是一步推出的,即A=>
β
\beta
β,则称
β
\beta
β是句型
α
β
δ
\alpha\beta\delta
αβδ相对于A->
β
\beta
β的直接短语。
例题:根据文法和语法树写出短语和直接短语

规律:在一棵句型对应的语法树中,以某非终结符为根的两代以上的子树的所有末端节点从左到右排列就是相对于该非终结符的一个短语,比如i1,*,i2是以T为根的子树,这棵子树有四层,该子树的末端是i1*i2。
如果子树只有两代,则该短语是直接短语,比如以F为根i1为孩子的子树和以F为根i2为孩子的子树以及以F为根i3为孩子的子树。
2.自下而上分析法——算符优先算法
2.1自下而上分析法概述
1.基本思想
从输入串开始,逐步归约,直到文法的开始。其中归约即为根据文法的产生式规则,把串中出现式的右部替换成左部符号。
从语法树上分析,就是从树叶节点开始,构造语法树。
2.2自下而上分析法——算符优先算法
1.按照算符的优先关系和结合性质进行语法分析。
归约顺序不同,计算的顺序也不同,结果也不一样。如果规定算符的优先次序,并按这种规定进行归约,则归约过程是唯一的。
2.优先关系

优先关系是左右敏感的,以下需要注意!

假定G是一个不含
ε
\varepsilon
ε产生式的算符文法。对于任何一对终结符a,b,我们补全下面填空:
1)当且仅当文法G中含有形如P—>…ab…或者P—>…aQb… 的产生式,这种关系符是a__b? 意味着ab或者aQb优先级相同,被归约到P。
2)当且仅当G中含有形如P—>…aR…的产生式,而R=>+b…或R=>+Qb….,这种关系符是a__b? 归约情况如下:

3)当且仅当G中含有形如P—>…Rb…的产生式,而R=>+…a…或R=>+…aQ…,这种关系符是a__b? 归约情况如下:

如果一个算符文法G中的任何终结符对(a,b)至多只满足以上三个关系之一,则称G是一个算符优先文法。
算符优先算法不是规范归约。
例题:
2.3求FIRSTVT,LASTVT集合
https://blog.csdn.net/qq_40147863/article/details/93203949
2.4 算符优先计算
https://blog.csdn.net/qq_37977106/article/details/80301761
3.自下而上分析法——LR分析法
2.移入—归约分析例题
查看当前栈顶文法串是否构成某个产生式的右部,如果是就弹栈并将该右部对应的左部入栈(归约),并持续更新归约树。每次归约的符号串称为“句柄”。
栈内符号串+剩余输入=“规范句型”,比如每个蓝框里的栈内符号串和剩余输入都表示规范句型。

2.1移入—归约工作过程
在对输入串的一次从左到右扫描过程中,语法分析器将零个或多个输入符号移入到栈的顶端,直到它可以对栈顶的一个文法符号串
β
\beta
β进行归约为止。
然后,它将
β
\beta
β归约为某个产生式的左部
语法分析器不断重复这个循环,直到它检测到一个语法错误,或者栈中包含了开始符号且输入缓冲区为空(这时语法分析器宣布成功并完成了语法分析)为止。
四种动作:移入、归约、接收、报错
2.2移入—归约分析中的关键问题
输入的文法串是文法的一个合法句子,但是在移入归约分析过程中,可能出现,剩余输入串为空,但是栈内文法串无法构成任何一个产生式的右部,这种情况下,文法分析器会报错,但是问题是这是一个合法句子啊?!!
在下例中,红框内,我们是选择把
i
B
i_B
iB归约为<IDS>,就造成上面所说的情况,这就是错误地识别了句柄,但是<IDS>,
i
B
i_B
iB本身就是第三个产生式的右部,所以我们可以把整个式子归约为<IDS>,改正之后的求解如下

下图是分析成功的:

在自底向上的归约过程中,采取的是最左归约,最左直接短语就是句柄。
2LR语法分析概述
计算机是如何识别句柄的呢?
2.1活前缀
是指规范句型的一个前缀,这种前缀不含句柄之后的任何符号,对于规范句型
α
β
δ
\alpha\beta\delta
αβδ,
β
\beta
β为句柄,如果
α
β
=
u
1
u
2
.
.
.
u
r
\alpha\beta=u_1u_2...u_r
αβ=u1u2...ur,则符号串
u
1
u
2
.
.
u
i
(
1
<
=
i
<
=
r
)
u_1u_2..u_i(1<=i<=r)
u1u2..ui(1<=i<=r)是
α
β
δ
\alpha\beta\delta
αβδ的活前缀。(
δ
\delta
δ必为终结符串)。
规范句型在LR分析过程中的任何时候,栈里的文法符号应该构成活前缀
2.1LR文法
LR文法是最大的、可以构造出相应移入—归约语法分析器的文法类
L:对输入进行从左到右的扫描
R:反向构造出一个最右推导序列
LR(k)分析:需要向前查看k个输入符号的LR分析,k=0和k=1这两种情况具有实践意义,当省略(k)时,表示k=1
2.2LR文法的基本原理
关键问题是如何正确识别句柄,句柄是逐步形成的,用“状态”表示句柄的进展程度,详细可见下图,LR分析器就是根据下图所示识别句柄的。

2.3 SLR(1)分析法
2.3.1 SLR(1)原理
移进归约冲突:项目集中同时出现移进项目和归约项目。如下图:

但是仔细观察这些存在冲突的项目集,可以发现移入和归约的操作时可以根据一些特征细分开来的,即是有方法消解该冲突的。
允许归约或者移入的条件或情形:以
I
1
I_1
I1冲突为例,计算出
FOLLOW(S’)={#}
FOLLOW(E)={+,),#}
如果当前单词在FOLLOW(S’)中,就对其归约为S’,如果当前单词是FOLLOW(E)中的,就将其移入,比如+。
冲突解决办法SLR(1):

SLR(1)更加一般化的形式:

2.3.2 SLR(1)分析表构造
这一部分主要学习根据有效项目计算项目集规范族并构造识别活前缀的DFA,并在此基础上根据SLR(1)文法构造没有冲突的SLR(1)分析表。
按照下述方法构造出的ACTION与GOTO表如果不含多重入口,则称该文法为SLR(1)文法。
SLR(1),LR(0)分析表构造方法的对比:

一个文法属于LR(0),那么也就属于SLR(1)的。
例题: 构造如下文法的识别活前缀的DFA以及SLR(1)分析表。

2.3.3 SLR(1)的缺陷
2.4 LR(1)分析法
1.引入向前搜索串(展望串)

2.LR(1) SLR(1)分析表构造区别LR(1)的展望信息更加精确

3.LR(0) SLR(0) LR(1)联系

3.LR(0)项目
3.1增广文法
如果G是一个以S为开始符号的文法,则G的增广文法G’就是在G中加上新开始符号S’和产生式S’—>S得到的文法,这样做的目的是为了使开始符号仅出现在一个产生式的左边,从而使得分析器只有一个接受状态,如下例:

例题:LR(0)自动机项目集和LR(0)分析表
(1)S—>BB
(2)B—>aB
(3)B—>b


1980

被折叠的 条评论
为什么被折叠?



