【问题标题】:Is the grammar LALR?语法是 LALR 吗?
【发布时间】:2010-04-21 10:23:41
【问题描述】:

假设相同的语法不是 LR(1),我们可以肯定地说该语法也不是 LALR 吗?

如果不是,那么语法成为 LALR 的条件是什么? (或使语法不是 LALR 的条件是什么)

感谢您的帮助!

【问题讨论】:

    标签: grammar


    【解决方案1】:

    LALR(1) ⊂ LR(1),所以是的,我们可以假设。这两种语法以相似的方式表达语言,但 LR(1) 比 LALR(1) 跟踪更多的左状态。参照。 These lecture notes,讨论了两种表示之间的状态差异。

    通常,解析器生成器将为您处理创建移位减少步骤的所有细节;不同之处在于,基于较大语法的生成器更有可能找到无冲突的解析策略。

    【讨论】:

      【解决方案2】:

      This document 比较两者。

      【讨论】:

        【解决方案3】:

        这是一个简单的语法,它是 LR(1) 但不是 LALR(1):

        G -> S 
        S -> c X t 
          -> c Y n
          -> r Y t
          -> r X n 
        X -> a
        Y -> a
        

        LALR(1) 解析器生成器为您提供 LR(0) 状态机。 LR(1) 解析器生成器为您提供 LR(1) 状态机。 使用这种文法,LR(1) 状态机多了一个状态 比 LR(0) 状态机。

        LR(0) 状态机包含这个状态:

        X -> a . 
        Y -> a .
        

        LR(1) 状态机包含这两种状态,而不是 如上所示:

        X -> a . { t }
        Y -> a . { n }
        
        X -> a . { n }
        Y -> a . { t }
        

        LALR 的问题在于状态是先生成的 没有任何关于外观的知识。然后看头 在状态产生后检查或创建。然后是 LALR 有这个状态和look-a-heads,通常稍后添加, 看起来像这样:

        X -> a . { t, n }
        Y -> a . { n, t }
        

        任何人都可以在这里看到问题吗?如果前瞻是't', 你选择哪种减法?模棱两可!所以 LALR(1) 解析器生成器为您提供减少-减少冲突 可能会使没有经验的语法感到困惑的报告 作家。

        这就是为什么我将LRSTAR 制作为 LR(1) 解析器生成器。它 可以处理上面的语法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-21
          • 1970-01-01
          相关资源
          最近更新 更多