在一个简单的例子中,我对如何通过删除左递归将该语法转换为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
好吧,我只是不确定它是否正确......
答案 0 :(得分:1)
首先,你的语法似乎接受由a
s分隔的b
s序列,因此没有2 b
汇集在一起。 (aaa...abaaaaa...abaaa...a
)这应该等同于:
Q -> P | P b P
P -> a | a P