【问题标题】:Grammar refactoring for LL parsing用于 LL 解析的语法重构
【发布时间】:2012-10-10 13:02:14
【问题描述】:

在一个简单的例子中,我很困惑如何通过删除左递归将这个语法变成 LL 语法。欢迎任何提示。

G = {
      A -> A a | A B | a
      B -> b
    }

我通过申请this algorithm得到以下信息:

G = {
      A -> a X
      X -> e | A | B X
      B -> b
    }

这似乎可以为解析器生成 C 伪代码:

void A() {
    switch (token) {
        case 'a' : next(); X(); break;
    }
}

void X() {
    switch (token) {
        case 'e' : finish(); break;
        case 'a' : A(); break;
        case 'b' : B(); X(); break;
    }
}

void B() {
    next();
}

并为单词生成解析树:aabab:

A ---+
|    |
a    X
     |
     A ---+
     |    |
     a    X ---+
          |    |
          B    X
          |    |
          b    A ---+
               |    |
               a    X ---+
                    |    |
                    B    X
                    |    |
                    b    e

好吧,我只是不确定它是否正确......

【问题讨论】:

    标签: grammar ll


    【解决方案1】:

    首先,您的语法似乎接受由单个bs 分隔的as 序列,因此没有2 个b 组合在一起。 (aaa...abaaaaa...abaaa...a) 这应该相当于:

    Q -> P | P b P
    P -> a | a P
    

    【讨论】:

    • 抱歉没说。我需要保持原始语法的一些结构。看看编辑。 =D
    • @Vinicius:好吧,您提出的语法(第二个)似乎是正确的。伪代码的唯一变化是(1)开关中的默认情况,产生错误,(2)'e' 不应该是字符,而是 EOF 或任何标记输入流结束的东西。
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多