6.9 Der DK-Automat
Von der Grammatik zu einem nichtdeterministischen endlichen Automaten
Um den
Diese übersetzen wir in einen verallgemeinert nichtdeterministischen Automaten,
bei dem jede Kante mit einem Wort
Wir brechen die Kanten in Stücke, so dass jede mit genau einem Zeichen beschriftet ist:
Nochmal: jede Kante ist mit einem Terminalsymbol beschriftet. Die Symbole
Wir werden uns noch bessere Namen für die Zwischenzustände ausdenken. Wenn wir uns
an die Rechtsableitungsbäume mit Stamm, linkem Rand, Blüte und rechtem Rest erinnern,
dann haben die Zwischenzustände eine klare Bedeutung: der Zustand
Die -Grammatik
Wir illustrieren obige Vorgehensweise nun anhand der Grammatik
Laut Gebrauchsanweisung aus dem letzten Teilkapitel hat die Grammatik
In dieser Grammatik betrachten wir die Rechtsableitung
Es gilt
Den nichtdeterministischen DK-Automaten (mit
Der nichtdeterministische DK-Automat
Definition 6.9.1 Für eine kontextfreie
Grammatik ist der nichtdeterministische DK-Automat (NDK-Automat) ein nichtdeterministischer
endlicher
Automat mit
- Für jede Produktion
gibt es einen Zustandsübergang -
Für jede Zerlegung
gibt es den Zustandsübergang - Falls
ein Nichtterminal ist, also , gibt es zusätzlich noch den Übergang
Die Interpretation dieser Übergänge in Rechtsableitungsbaum-Begriffen ist:
(1) heißt, dass
Der Startzustand ist
Den NDK-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
Der NDK-Automat
Der Anfangszustand
Wir fügen alle Zustände hinzu, die wir per
Wir fügen alle Zustände hinzu, die wir per
Wir fügen alle Zustände hinzu, die wir per
Dann gehen wir wie gewohnt vor. Nur
einer der fünf Zustände in unserem Korb hat einen
Alle diese haben einen
Die
Die
Die
Die
Jetzt ist der Zustand fertig.
Wieder haben drei Zustände einen
Wieder haben drei Zustände einen
Wieder haben drei Zustände einen
Per
Per
Per
Noch ein Ausgang
Und hier nochmal das Endergebnis, wobei wir die Zustände im DK-Automaten durchnummeriert haben:
Streng genommen ist das Ergebnis kein deterministischer Automat, da zum Beispiel der
Startzustand keinen
Den DK-Automaten verwenden
Wie verwenden wir jetzt den DK-Automaten? In jedem Parser-Schritt füttern wir den
DK-Automaten mit dem Stack-Inhalt.
Landet der Automat auf einem nichtaktzeptierenden Zustand, müssen wir ein weiteres Zeichen
lesen, d.h. auf den
Stack legen. Landet er auf einem akzeptierenden Zustand, so enthält dieser ein
erst nach vier Zeichen landet der Automat in dem akzeptierenden Zustand
Wir landen in dem akzeptierenden Zustand
und wir reduzieren per
Der Knackpunkt liegt bei Zustand
reduziert, was kein korrekter Linksreduktionsschritt ist, weil
korrekt. Wir sehen also:
Die Grammatik abändern: Stopper-Zeichen am Schluss
In diesem Fall lässt sich das Dilemma flicken, indem wir ein Stopperzeichen am Ende einfügen. Wir ändern die Grammatik leicht ab:
Es gilt also
Das
Die Klammern-Grammatik
Als nächstes Beispiel schauen wir uns eine Grammatik an, die die wohlgeformten Klammerausdrücke generiert:
mit den Terminalen
Auch in diesem Automaten haben akzeptierende Zustände ausgehende Kanten, die zu weiteren
akzeptierenden Zuständen führen. Somit ist
alles Wörter in
ein gültiger Linksreduktionsschritt ist, dann kennen wir
Übungsaufgabe 6.9.1
Lassen Sie den LR-Parser auf
Übungsaufgabe 6.9.2 Zeichnen Sie NDK-Automaten und DK-Automaten für die Grammatik
und zeigen Sie, dass diese nicht LR(0) ist. Finden Sie
also eine Produktion
Übungsaufgabe 6.9.3 Untersuchen Sie unsere Arithmetik-Grammatik:
Zeichnen Sie NDK- und DK-Automaten und zeigen Sie, dass die Grammatik nicht LR(0) ist.
Challenge. Fügen wir den arithmetischen Ausdrücken noch ein
Schlusszeichen
Der DK-Test
Wir beschreiben nun, wie man algorithmisch testet, ob eine gegebene Grammatik die LR(0)-Bedingungen erfüllt.
Theroem 6.9.2 (DK-Test). Sei
-
(DK.1) Ein akzeptierender Zustand von
(der ja eine Menge von Zuständen des NDK-Automaten ist) enthält genau einen akzeptierenden NDK-Zustand, also genau ein -
(DK.2) Wenn
ein akzeptierender Zustand von ist und , dann ist ein Nichtterminal.
Wenn diese beiden Bedingungen gelten, sagen wir, dass
Beweisskizze. Wir erinnern den Leser noch einmal an die alternative Charakterisierung von LR(0)-Sprachen, nämlich :
Lemma
5.7.5, noch einmal
(LR(0), äquivalente Formulierung).
Eine Grammatik
- Falls
dann auch und ; in Worten: wenn die Fronten identisch sind, dann auch die Reduktionsschritte. -
Wenn
und , dann ; in Worten: wenn ein echter Präfix von ist, dann muss in dem überstehenden Teil von mindestens ein Nichtterminal vorkommen.
Es ist nicht schwer zu sehen, dass (DK.1) äquivalent zu Punkt 1 des Lemmas ist. Wenden wir uns (DK.2) und Punkt 2 zu. Wenn Punkt 2 nicht gilt, dann gibt es korrekte Reduktionsschritte
Wenn wir dem Automaten den Präfix
Wenn umgekehrt (DK.2) nicht gilt, dann gibt es
einen akzeptierenden Zustand
Übungsaufgabe 6.9.4
Zeigen Sie: wenn
Zeigen Sie das selbe für den DK-Automaten.
Es gibt also einen Weg