Von der Grammatik zu einem nichtdeterministischen endlichen Automaten
Um den -Parser gemäß
Algorithmus 5.5.10
zu implementieren, müssen wir den
Test
durchführen und,
falls die Antwort ja ist, die Blüte finden.
Dies gelingt uns, indem wir die Grammatik
in einen endlichen Automaten umwandeln.
Theorem 4.3.8
und die ihm vorhergehende Konstruktion zeigen, wie man das macht.
Anstatt allerdings das Theorem als "black box" zu verwenden, gehen
wir die Konstruktion für die Grammatik Schritt für
Schritt durch, weil uns das weitere Erkenntnisse erschließen wird.
Wir demonstrieren die Konstruktion anhand der Grammatik
Warnung: dies ist keine LR(0)-Grammatik, wie wir bald sehen werden.
Die Grammatik und der DK-Automaten aber können für alle
kontextfreien Grammatiken konstruiert werden, ob LR(0) oder nicht.
Ich konstruiere nun den nichtdeterministischen Automaten
für die Sprache :
Todo: beschreiben, wie man von zu
dem Automaten mit den Punkt-Zuständen kommt.
Im konkreten Fall kann das recht kompliziert werden.
Das Prinzip ist aber einfach. Jeder Zustand
hat eine -Kanten für jede
Produktion , und diese führt zum Zustand
.
Ein Zustand
,
wo auf den Punkt ein Terminalsymbol folgt, hat eine
ausgehende Kante:
Wenn auf den Punkt ein Nichtterminal folgt, also
,
hat zwei ausgehende Kanten:
Den Automaten deterministisch machen
Wir wissen ja bereits, wie man einen nichtdeterministischen Automaten
deterministisch macht: die
Potenzmengenkonstruktion
aus Kapitel 4.3. Hier können wir diese leider nicht direkt anwenden,
da der obige Automat -Übergänge hat. Wie geht das also nun?
Im deterministischen Automaten ist wie bei der Potenzmengenkonstruktion
jeder Zustand eine Menge von Zuständen des nichtdeterministischen
Automaten. Wenn wir nun in eine solche Menge einen Zustand einfügen,
dann fügen wir auch alle Zustände hinzu, zu denen es einen
-Übergang gibt.
Für den obigen nichtdeterministischen Automaten sieht das dann so aus:
Todo: Erklären, warum dieser Automat zeigt, dass es nicht LR(0) ist.
DK-Test erklären, Beweis.
LR(1)-Grammatiken
Hier ist der nichtdeterministische Automat für mit Lookahead 1.
Jetzt machen wir den Automaten deterministisch: