LL解析的语法重构

时间:2012-10-10 13:02:14

标签: grammar ll

在一个简单的例子中,我对如何通过删除左递归将该语法转换为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

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

1 个答案:

答案 0 :(得分:1)

首先,你的语法似乎接受由a s分隔的b s序列,因此没有2 b汇集在一起​​。 (aaa...abaaaaa...abaaa...a)这应该等同于:

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