我如何看出 LR(0) 项自动机中存在冲突?
How do I see that there is a conflict in the LR(0) items automata?
关于 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 ::= •
,以及其他不以 •
.
结尾的项目
关于 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 ::= •
,以及其他不以 •
.