【问题标题】:How do I make this grammar LL(1)?如何使这个语法 LL(1)?
【发布时间】:2015-03-18 21:22:13
【问题描述】:

假设我有这个语法

E -> T+Ex | F
T -> T*Fy | w
F -> E | z | ε

现在我需要将其设为 LL(1)。我一直在遵循这些步骤,但我想出的解决方案似乎不太正确。 拳头可以消除ε-产生式

E -> T+Ex | F | T+x
T -> T*Fy | w | T*y
F -> E | z

现在我们将消除循环

E -> T+Ex | T+x | z
T -> T*Fy | w | T*y
F -> T+Ex | T+x | z

不,我们将消除立即左递归

E -> T+Ex | T+x | z
T -> wT'
T' -> *FyT' | *yT' | ε
F -> T+Ex | T+x | z

最后,我们将替换出现 T 的某些 RHS 产品

E -> wT'+Ex | wT'+x | z
T -> wT'
T' -> *FyT' | *yT' | ε
F -> wT'+Ex | wT'+x | z

现在这对我来说似乎不是 LL(1),因为由此生成的解析表将包含多个终端的多个条目。我似乎缺少什么?

【问题讨论】:

    标签: parsing compiler-construction grammar theory ll


    【解决方案1】:

    我想出了怎么做,所以最后一步我们有了这个配置

    E -> wT'+Ex | wT'+x | z
    T -> wT'
    T' -> *FyT' | *yT' | ε
    F -> wT'+Ex | wT'+x | z
    

    我们现在需要执行左因式分解来删除表单的产生式

    S -> aB | aC
    

    并将它们制成适当的形式

    S -> aA
    A -> B | C
    

    使用这个我们可以将我们的语法转换成

    E -> wT'+E' | z
    E' -> Ex | x
    T -> wT'
    T' -> *T'' | ε
    T'' -> FyT' | yT'
    F -> wT'+F' | z
    F' -> Ex | x
    

    由于FF'EE' 相同,我们可以删除这个产生式,这样就剩下了。

    E -> wT'+E' | z
    E' -> Ex | x
    T -> wT'
    T' -> *T'' | ε
    T'' -> EyT' | yT'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多