В прост пример, объркан съм как да превърна тази граматика в LL, като премахна лявата рекурсия. Всякакви съвети са добре дошли.
G = {
A -> A a | A B | a
B -> b
}
Получавам следното, като прилагам този алгоритъм:
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
Е, просто не съм сигурен дали е правилно...