【问题标题】:How can an LR(0) parser ever leave state 0?LR(0) 解析器如何离开状态 0?
【发布时间】:2012-10-26 10:05:13
【问题描述】:

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

Wikipedia's example, with its explanation, says:

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

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

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

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

【问题讨论】:

    标签: parsing language-agnostic lr


    【解决方案1】:

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

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

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

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


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

    【讨论】:

    • 哦哈,所以 LR(0) 语法永远不会导致第一步减少?
    • 对。它不能减少任何东西。 :)
    • 不,我收回了。它可以归约,因为归约规则会将其置于不同的状态。关键是它必须在不知道输入是什么的情况下减少,所以它必须总是从状态 0 开始减少。此外,此时堆栈上没有任何东西,所以它不能减少任何东西,所以它必须是一个空规则。但我想这仍然是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多