问题描述
关于LR(0)
,我还没有完全理解。我试图弄清楚语法何时不是 LR(0)
。据我所知,我构建了 LR(0)
项自动机。然后我需要寻找冲突。但我不认为我完全理解 LR(0)
项自动机中的两项之间何时存在冲突。
是否有可能澄清这部分的事情?我什么时候知道 LR(0)
项自动机中是否存在冲突?查看一两个示例会有所帮助(不是针对语法本身,而是针对存在某种冲突的两个项目)。
例如:
S ::= T C
T ::= char
T ::= int
C ::= [ num ] C
C ::= ''
我明白了:
为什么 4 和 8 之间会有冲突?
解决方法
不存在“4 和 8 之间的冲突”。 (这是没有意义的,因为解析机总是处于完全一种状态。)这两种状态中的每一种(独立地)都有冲突。
LR(0) 解析器无法使用前瞻来预测动作,因此每个状态必须具有:
- 每个输入的移位转换,或
- 对每个输入执行相同的归约操作
这意味着,如果状态的项集中有一个以 • 结尾的项(即一个可还原项),那么它必须是项集中的唯一项。任何其他项目要么是转变,要么是不同的减少。而机器中的状态 4 和 8 则不是这种情况;它们都有 C ::= •
项,以及其他不以 •
结尾的项。