3

我已经阅读了 Wikipedia 的解释至少十几次,但我仍然对 LR(0) 解析器如何离开状态 0 感到困惑。

维基百科的例子及其解释说

解析器从仅包含初始状态 ( '0') 的堆栈开始: [0]
解析器看到的输入字符串中的第一个符号是'1'

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

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

那么它如何使用表格来确定从状态 0 转换或减少到哪个状态呢?

4

1 回答 1

4

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

LR(0) 语法必须在不咨询下一个符号的情况下决定减少。一旦他们决定不减少,他们就暗中决定改变。[1]

移位动作包括读取一个符号,将其压入堆栈,并查阅动作表以决定转换到哪个状态。

这与 LR(k>0) 文法不同,LR(k>0) 文法可以使用前瞻符号来决定移位和归约,而 LR(0) 文法不能。但是他们俩都可以在读取移位的符号后决定进入哪个状态。


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

于 2012-10-27T05:05:33.617 回答