SLR(1)混乱

时间:2016-03-10 20:13:07

标签: parsing compiler-construction lr

enter image description here

{{1}}

基于定义,0,2和4具有移位/减少冲突。 以下S组是“)”。 对于状态2中的SLR(1),“(”不在S的跟随集中,但为什么这是SLR(1)? 你能解释一下slr(1)的转换/减少冲突规则,我可能会对某些事情感到困惑。

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)。