我已经阅读了维基百科的解释至少十几次,但我仍然对LR(0)解析器如何离开状态0感到困惑。
Wikipedia's example, with its explanation, says:
解析器从包含初始状态(
'0'
)的堆栈开始:[0]
解析器看到的输入字符串中的第一个符号是'1'
。
...但这对我没有意义,因为看到输入符号会执行前瞻,但根据定义,LR(0)解析器无法执行超前。
当解析器处于状态0时,它还没有移位,因此它的堆栈上没有任何符号。
鉴于它是一个LR(0)解析器,它也不能执行前瞻。
那么如何使用该表来确定从状态0转移或减少哪个状态?
答案 0 :(得分:3)
移位的符号不是前瞻。它消耗了。
LR(0)语法必须决定减少而不咨询下一个符号。一旦他们决定不减少,他们就暗中决定转移。 [1]
移位操作涉及读取符号,将其推入堆栈,并查阅操作表以确定要转换到哪个状态。
这与LR(k> 0)语法的不同之处在于LR(k> 0)语法可以使用先行符号来决定移位和缩小,而LR(0)语法不能。但是他们两个都可以决定在读取移位的符号后转到哪个状态。
[注1] ......或接受,如果移位的符号是输入结束标记,但这只是状态的特殊情况。