1
在一個簡單的示例中,我很困惑如何通過刪除左遞歸將此語法轉換爲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
好吧,我只是不知道這是否是正確的......
對不起,不說了。我需要維護原文的一些結構。看看編輯。 = D – vmassuchetto
@Vinicius:好的,你提出的語法(第二個)似乎是正確的。僞代碼中唯一的變化是(1)開關中的缺省情況,產生一個錯誤,(2)''e''應該不是一個字符,而是EOF或者任何標記輸入流結束的地方。 – Vlad