Compiler construction 如何理解非LR(0)reduce状态在构造具有自动错误恢复的高效LALR(k)解析器的实用方法中的作用

Compiler construction 如何理解非LR(0)reduce状态在构造具有自动错误恢复的高效LALR(k)解析器的实用方法中的作用,compiler-construction,grammar,eclipse-jdt,lr,lalr,Compiler Construction,Grammar,Eclipse Jdt,Lr,Lalr,我不明白非LR(0)reduce状态从何而来。 这是否意味着: 删除LR(0)减少状态和get LR’(0)状态 使用LR'(0)状态生成LR(K)状态。非LR(0)还原态来自LR(K)态 这是一份 请阅读第4.2章还原状态是指可以还原的状态。也就是说,如果状态的itemset包含最终项,则状态为reduce状态 如果reduce状态是LR(0)——这意味着该状态的操作可以在没有任何前瞻性的情况下被识别——那么该状态的itemset只能是单个项,必须是final。(如果不是这种情况,则状态不能是

我不明白非LR(0)reduce状态从何而来。 这是否意味着:

  • 删除LR(0)减少状态和get LR’(0)状态
  • 使用LR'(0)状态生成LR(K)状态。非LR(0)还原态来自LR(K)态
  • 这是一份


    请阅读第4.2章

    还原状态是指可以还原的状态。也就是说,如果状态的itemset包含最终项,则状态为reduce状态

    如果reduce状态是LR(0)——这意味着该状态的操作可以在没有任何前瞻性的情况下被识别——那么该状态的itemset只能是单个项,必须是final。(如果不是这种情况,则状态不能是LR(0),因为可能有多个操作可用,只能通过前瞻来区分。)

    正如他指出的,LR(0)reduce操作必须是正确的,因为在该状态下不可能有其他操作。因此,即使前瞻令牌将生成需要错误恢复的错误,减少也不需要撤消。因此,作者建议删除LR(0)reduce状态

    当然,并非所有状态都是LR(0)。在大多数州,采取的行动将取决于前瞻。特别是,在非LR(0)reduce状态中,reduce将取决于前瞻令牌。并且,在移除LR(0)reduce状态之后,所有剩余的reduce状态都是非LR(0)

    但是,由于表压缩可能会用默认的缩减来替换错误操作(而且,我认为,由于LALR状态合并,尽管本章可能不涉及LALR),所以很可能为前瞻标记指示的缩减实际上是不正确的。在这种情况下,可能需要撤消减少,以便从错误中恢复

    作者的假设似乎是,通常情况下,撤销缩减是不可能的,因此解析器需要推迟缩减操作(包括堆栈修改),直到知道缩减确实有效为止,这将是解析器最终执行移位的时候。本章的其余部分涉及实现这一目标