我如何看到 LR(0) 项自动机中存在冲突?

问题描述

关于LR(0),我还没有完全理解。我试图弄清楚语法何时不是 LR(0)。据我所知,我构建了 LR(0)自动机。然后我需要寻找冲突。但我不认为我完全理解 LR(0)自动机中的两项之间何时存在冲突。 是否有可能澄清这部分的事情?我什么时候知道 LR(0)自动机中是否存在冲突?查看一两个示例会有所帮助(不是针对语法本身,而是针对存在某种冲突的两个项目)。

例如:

S ::= T C
T ::= char
T ::= int
C ::= [ num ] C
C ::= ''

我明白了:

enter image description here

为什么 4 和 8 之间会有冲突?

解决方法

不存在“4 和 8 之间的冲突”。 (这是没有意义的,因为解析机总是处于完全一种状态。)这两种状态中的每一种(独立地)都有冲突。

LR(0) 解析器无法使用前瞻来预测动作,因此每个状态必须具有:

  1. 每个输入的移位转换,或
  2. 对每个输入执行相同的归约操作

这意味着,如果状态的项集中有一个以 • 结尾的项(即一个可还原项),那么它必须是项集中的唯一项。任何其他项目要么是转变,要么是不同的减少。而机器中的状态 4 和 8 则不是这种情况;它们都有 C ::= • 项,以及其他不以 结尾的项。