Parsing LR(0)解析器如何离开状态0?

Parsing LR(0)解析器如何离开状态0?,parsing,language-agnostic,lr,Parsing,Language Agnostic,Lr,我已经读了维基百科的解释至少十几遍了,但我仍然对LR(0)解析器如何离开状态0感到困惑 : 解析器从只包含初始状态的堆栈开始('0'): [0] 解析器看到的输入字符串中的第一个符号是'1' 。。。但这对我来说没有意义,因为看到输入符号将执行前瞻,但根据定义,LR(0)解析器不能执行前瞻 当解析器处于状态0时,它还没有移动,因此它的堆栈上没有任何符号。 鉴于它是一个LR(0)解析器,它也不能执行前瞻 那么,它如何使用该表来确定从状态0移动或减少到哪个状态呢?移动的符号不是前瞻性的。它被消耗掉了

我已经读了维基百科的解释至少十几遍了,但我仍然对LR(0)解析器如何离开状态0感到困惑

:

解析器从只包含初始状态的堆栈开始(
'0'
):
[0]

解析器看到的输入字符串中的第一个符号是
'1'

。。。但这对我来说没有意义,因为看到输入符号将执行前瞻,但根据定义,LR(0)解析器不能执行前瞻

当解析器处于状态0时,它还没有移动,因此它的堆栈上没有任何符号。
鉴于它是一个LR(0)解析器,它也不能执行前瞻


那么,它如何使用该表来确定从状态0移动或减少到哪个状态呢?

移动的符号不是前瞻性的。它被消耗掉了

LR(0)语法必须决定在不查阅下一个符号的情况下进行缩减。一旦他们决定不减少,他们就含蓄地决定改变。[1]

shift操作包括读取符号,将其推到堆栈上,并查阅操作表以决定转换到哪个状态

这与LR(k>0)语法的不同之处在于,LR(k>0)语法可以使用先行符号来决定移位和缩减,而LR(0)语法则不能。但他们两人在读到移位符号后都可以决定转到哪个状态



[注1]…或者接受,如果移位符号是输入结束标记,但这只是状态的一种特殊情况。

Oh-huh,那么LR(0)语法永远不会在第一步导致减少?对。它不能减少任何东西。:)不,我收回。它可以减少,因为减少规则会将其置于不同的状态。关键是它必须在不知道输入是什么的情况下减少,因此它必须始终从状态0减少。此外,此时堆栈上没有任何内容,因此它不能减少任何内容,因此它必须是一个空规则。但我认为这仍然是可能的。