{{1}}
基于定义,0,2和4具有移位/减少冲突。 以下S组是“)”。 对于状态2中的SLR(1),“(”不在S的跟随集中,但为什么这是SLR(1)? 你能解释一下slr(1)的转换/减少冲突规则,我可能会对某些事情感到困惑。
答案 0 :(得分:0)
让我们从你的语法开始:
S→(S)S | ε
要为此语法构建SLR(1)解析器,我们需要使用新的启动规则对其进行扩充:
开始→S
S→(S)S | ε
请注意,FOLLOW(S)包含)和 $ ,没有其他符号。
我们现在可以通过构建LR(0)自动机并使用其FOLLOW设置扩充每个生产来开始构建SLR(1)自动机:
(0)
Start -> .S [$]
S -> .(S)S [$)]
S -> . [$)]
(1)
Start -> S. [$]
(2)
S -> (.S)S [$)]
S -> .(S)S [$)]
S -> . [$)]
(3)
S -> (S.)S [$)]
(4)
S -> (S).S [$)]
S -> .(S)S [$)]
S -> . [$)]
(5)
S -> (S)S. [$)]
你声称状态0,2和4有转移/减少冲突,但我实际上并不认为这是这种情况。在状态(0)中,我们有完成的项目S→。,但前瞻是$和)。这意味着我们只减少$和)。另一方面,这里唯一的转移动作发生在(符号。
如果我们在这里没有前瞻,我们就会发生转变/减少冲突,但是由于前瞻性,如果我们看到(并且如果我们看到的话会减少)或者$,我们知道要转移。如果您检查标记的其他状态,您将看到相同的逻辑适用。
结果,这个语法确实是SLR(1)。