前言
LR(0)的分析表是LR(0)分析中最重要的部分,同时这张表也是LR(0)分析中最复杂和最难的部分。
构造过程:
1、先求文法的所有项目,并对其分类
2、构建项目集规范族(在构造之前先掌握项目集闭包运算,和go函数的求解)
3、构建自动机
4、根据自动机填写分析表
先求文法的所有项目,并进行分类
- 项目:用"•“对产生式就行分割
分类:
1)移进项目:后继符号为终结符号
2)待约项目:后继符号为终结符号
3)规约项目:后继符号位空,即”•"出现在产生式的最后
4)接受项目:文法开始符号的规约项目
例1:求文法G[A`]
的所有项目,并对其进行分类
求项目集的闭包
- 计算方法如下:
设I为项目集,则CLOSURE(I)如下
1)I中的每个项目都属于CLOSURE(I)
2)如果项目A->α·Bβ属于CLOSURE(I),
且B为非终结符号,且B->γ是文法中的一个产生式,
则将形如B->·γ的项目添加到CLOSURE(I)中
3)重复步骤2)直到CLOSURE(I)不在扩大
例2:按照上例的结果,设I={A`-> ·A},求CLOSURE(I)
求项目集的转换函数go
- 计算go(I,X)(X∈Vn∪Vt)时,先找到项目集I中形如A->α·Xβ的项目,并将该项目读入X后的项目A->αX·β求闭包
即CLOSURE(A->αX·β)
其结果就是go(I,X)的结果
例3:通过例1的结果,设I={A`->·A、A->·(A)、A->a},求go(I,‘(’)
求项目集规范族
在学习和掌握了前面的求项目、求项目集闭包、求项目转换函数后,就可学习求项目的规范族了
-设项目规范族为C
1)令C={
I
0
{I_{0}}^{}
I0 },其中
I
0
{I_{0}}^{}
I0 =CLOSURE(开始项目)
2)对每个
I
i
{I_{i}}^{}
Ii ∈C和
I
i
{I_{i}}^{}
Ii 中形如“·X”的项目求go(
I
i
{I_{i}}
Ii ,X),若其结果非空且不属于C,则将go(
I
i
{I_{i}}
Ii ,X)的结果加入C中
3)重复2)直到C不在增加
例4:通过例1的文法和项目,求其LR(0)的项目要规范族C:
构造自动机
- 1)将项目规范族中的每个项目集作为DFA的状态,其中含有开始项目的作为DFA的初态,含有规约项目的做为DFA的终态
- 2)文法中的终结符号和非终结符号作为DFA的字母表
- 3)将转换函数go(
I
i
{I_{i}}^{}
Ii,X)作为单值转换函数
例5:将例4得到的项目规范集转换为自动机
根据自动机填写分析表
- 动作表(action)的每列头行为所有非终结符号,状态转换表goto表每列头行为所有终结符号
- 每行的首列为自动机的状态号
- 填表依据:
- 1)若一个状态到另外一个状态的箭头上为终结符号,则为移进,在action表中填入 S j {S_{j}} Sj (S表示移进,j表示箭头所指的状态)
- 2)若一个状态到另外一个状态的箭头上为非终结符号,则在goto表中填入j(j表示箭头所指的状态)
- 3)若某个状态没有箭头射出,则在该状态所在的行的action部分填入
r
p
{r_{p}}
rp(其中,r表示规约,p表示该状态中规约项目所对应的拓广文法的编号)
例6:根据例5设计其对应的LR(0)分析表
至此结束