So gehts also. Hätte ich auch mal eher drauf kommen können!
|
1 2 3 4 |
L e : e '+' 'Y' L e : e '+' 'X' e : 'Y' e : 'X' |
bei input “X+X+X” als Rekursiv Descent Parser:
(1) Probiere alle nicht-linksrekursiven Produktionen aus (e : ‘Y’, e : ‘X’)
(2) Parse tree merken (“X”)
(3) Probiere alle links-rekursiven Produktionen aus (e : e ‘+’ ‘Y’, e : e ‘+’ ‘X’), setze für e vorherigen ParseTree ein (“X+X”)
(4) Probiere alle links-rekursiven Produktionen aus (e : e ‘+’ ‘Y’, e : e ‘+’ ‘X’), setze für vorherigen ParseTree ein (“X+X+X”)
(5) Probiere alle links-rekursiven Produktionen aus (e : e ‘+’ ‘Y’, e : e ‘+’ ‘X’), setze für vorherigen ParseTree ein (“X+X+X”), keine weitere Eingabe vorhanden
(6) Ergebnis: “X+X+X”
Es kann ja so einfach sein. Wieso denke ich so dümmlich kompliziert? Der Martin hat’s jedenfalls genauso gelöst.
|
1 |
echo -n "X+X+X" | rpagrep -e "exp ::= <exp> '+' Y | <exp> '+' X | Y | X" --no-optimizations --no-cache --no-bitmap --exec-debug |
Got’ya! Jetzt nur in eigenen Code gießen… 🙂
Das erklärt im übrigen auch normalizeleftrecursion()…