用表7.11的LR(1)分析表分析输入串ab#的分析过程如表7.13所示。
表 7.13 对输入串ab#用LR(1)分析的过程
|
步骤 |
状态栈 |
符号栈 |
输入串 |
ACTION |
GOTO |
1
2
3
|
0
03
034 |
#
#a
#ab |
ab#....
b#....
#.... |
S3
S4
出错 |
 |
|
在LR(1)项目集规范族中,当分析进入状态I4时,b后只能出现a或b而不能出现'#'号,因而出错。
用表7.12的LALR(1)分析表分析同样的输入串ab#分析过程如表7.14所示。
表 7.14 对输入串ab#用LALR(1)分析的过程
|
步骤 |
状态栈 |
符号栈 |
输入串 |
ACTION |
GOTO |
1
2
3
4
5
|
0
0(3,6)
0(3,6)(4,7)
0(3,6)(8,9)
02 |
#
#a
#ab
#aB
#B |
ab#....
b#....
#....
#....
#.... |
S3,6
S4,7
r3
r2
出错 |
.
.
(8,9)
2 |
|
表 7.13 和表 7.14 说明对输入串ab#用LR(1)分析比用LALR(1) 分析提前两步发现错误。
在LR(1)分析中I4的向前搜索符只有{a,b},而用LALR(1)分析由于I4,I7为同心集,合并同心集后I4的向前搜索符集合变为{a,b,#},所以集合扩大了,因而发现错误的时间也就推迟了。表7.14对ab#的分析进行了两步多余归约,但是发现错误的位置还是确切的。
|