引言:
求出下面文法的LR(0)分析表具体求的方法见LR(0)项目集规范族的构造及LR(0)分析表的构造_用编程写诗的博客-优快云博客
(0) S’→
S
(1) S→
rD
(2) D→D,i
(3) D→i

我们可以看到S5和r1部分出现了冲突这个是移进规约冲突我们需要解决这个冲突那么我们现在所掌握的知识显然是不够的。所以我们需要引入新的东西来解决这个问题
这里提一下冲突是有两种的:
移进
-
归约冲突
移进和归约项目同时存在形如:
A→α·aβ
B→γ·
归约
-
归约冲突
归约和归约项目同时存在形如:
A→β·
B→γ·
假若一个文法
G
的拓广文法
G’
的活前缀识别自
动机中的每个状态
(
项目集
)不
存在
下述情况
既含移进项目又含归约项目
或者含有多个归约项目
则称
G
是一个
LR(0)
文法
LR(0)
文法规范族的每个项目集不包含任何冲
突项目
(
移进
-
归约冲突、归约
-
归约冲突
)
接下来开始引入SLR(1)分析
I ={
X→
α
·
bβ
,
移进项目
A→
α
·
,
归约项目
B→
α
·
}
归约项目
存在移迚
-
归约冲突和归约
-
归约冲突,但是叧要满足:
FOLLOW(
A
) ∩ FOLLOW (
B
) = Ø
FOLLOW(
A
) ∩{
b
} = Ø
FOLLOW(
B
) ∩{
b
} = Ø
当状态
I
面临输入符号
a
时,则动作可以按一下规定决策
(1)
若
a = b
,
则移进
b
(2)
若
a
∈
FOLLOW
(A),
则使用
A→
α
归约
(3)
若
a
∈
FOLLOW
(B),
则使用
B→
α
归约
(4)
否则,
报错
鉴于以上思想,构造
SLR
表两步走:
首先,
要先构造识别活前缀的
DFA
,
方法与
LR(0)
相同
然后,
根据
DFA
构造
SLR
分析表
,
此
时会用到
FOLLOW
集
一般地若一个
LR(0)
项目集
I
中有
m
个移进项目,
n
个归约项目,即:
I ={
A
1→
α
·a
1
β
1
,
移进项目
A
2→
α
·a
2
β
2
,
…
Am→ α
·a
m
β
m
,
B1
→ α
·
,
归约项目
B2
→ α
·
…
Bn
→ α
·
}
如果所有移进项目向前看一符号
集合
{
a
1
,
a
2
,
…,a
m
}
和所有
FOLLOW(Bi)
两两交集
均为空
,
那么当状态
I
面临输入符号
a
时
:
(1)
若
a = a
i
,
则移进
a
i
(2)
若
a
∈
FOLLOW(B
i
),
则使
用
B
i→
α
归约
(3)
否则,
报错
这种解决冲突的方法称为
SLR(1)
方法。若文法的
LR(0)
项目集规范族中所有
项目集的冲突均能如此解决,则称此文法为
SLR(1)
文法
。
对
DFA C={I
0
,I
1
,…,I
n
},
构造
SLR
分析表
在构造
LR(0)
分析表的基础上更改
(1)
若
A→
α·aβ
∈
I
k
且
GO(
I
k
,a)=
I
j
,
则
ACTION[
k,a
]
=sj
(2)
若
A→
α·
∈
I
k
,
则
a
∈
FOLLOW
(A)
,
ACTION[
k,a
]=
rj
(假定产生式
A→
α
是文法
G’
的第
j
个产生式)
(3)
若
S’→
S·
∈
I
k
,
则
ACTION[
k,#
]=
acc
(4)
若
GO(I
k
,A)=I
j
,
则
GOTO[k,A]=j
(5)
分析表中凡是不能用以上规则填入信息的空白格均置
上“报错标志”
注意:所有的规约项目都是要求FOLLOW集合的。都是要求的。都是要求的。强调三次!!!并不是只有产生冲突才去求是都要求!!!
例题:
(0) E’→
E
(1) E→E+T
(2) E→T
(3) T→T*F
(4) T→F
(5) F→(E)
(6) F→i
