6.7 LR-Grammatiken

Motivation und Intuition

Die LL-Parser, die wir in Kapitel 5.4 gesehen haben, versuchen, eine Linksableitung Sw Schritt für Schritt zu konstruieren. Eine Hauptschwäche ist, dass Sie von einer Wortform wAα die nächste Ableitungsregel Aβ bestimmen müssen, ohne das "Endergebnis" von β überhaupt vollständig gelesen zu haben. Sie müssen also erkennen, dass der rote / mit "?" markierte Pfeil in der Ableitung SwAα?wβαwxαwxy die richtige Entscheidung ist, obwohl sie von dem aus β abgeleiteten Wort x nur die ersten k Buchstaben sehen. Dem entgegen haben wir in den letzten zwei Teilkapiteln LR-Parser gesehen. Diese versuchen, von w ausgehend eine Rechtsableitung Sw zu finden, allerdings in zeitlich umgekehrter Reihenfolge, also

wα1α2αt1S

Notation

Da aus der Sicht unseres neuen Parsers die Rückwärtsanwendung einer Produktion Xβ, also der Schritt αXγαβγ einen Fortschritt darstellt und zeitlich auch nach vorne geht, verwende ich ab jetzt ein neues Pfeilsymbol, das von links nach rechts geht und daher dem in Europa üblichen Gefühlt, dass die Zeit von links nach rechts verläuft, mehr entgegen kommt: αβγαXγ.

Definition 6.7.1 (Reduktion und Linksreduktion) Seien α,β,γ(ΣN) Wortformen und Xβ eine Produktion. Dann schreiben wir αβγαXγ , und sagen αβγ reduziert zu αXγ. Man nennt einen solchen Schritt auch einen Reduktionsschritt.

Wir nennen den Schritt einen Linksreduktionsschritt, wenn rechts von β nur Terminale stehen. Wenn also γ=wΣ und somit αβwαXw .

Eine Folge von Linksreduktionsschritten nennen wir eine Linksreduktion. Links, weil wir uns von links nach rechts in den terminalen Teil hineinarbeiten. Wir werden im folgenden nur Linksreduktionsschritte betrachten und sagen daher manchmal auch einfach nur Reduktionsschritt.

Beobachtung: Wenn wir einen Linksreduktionsschritt αβwαXw betrachten, also αXwαβw , so sehen wir, dass das am weitesten rechts stehende Nichtterminal ersetzt worden ist; Linksreduktionen entsprechen also einer Rechtsableitung.

In den vorherigen Kapiteln, insbesondere beim Implementieren eines Parsers, haben wir gesehen, dass nicht jeder Linksreduktionsschritt automatisch auch korrekt ist. Ein einfaches Beispiel war die "Zahlengrammatik"

NDNNDD0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

So ist folgende Linksreduktion korrekt:

14D4N4NDN

weil sie einer gültigen Rechtsableitung NR14 entspricht (N ist das Startsymbol). Folgende Reduktionen sind allerdings inkorrekt:

14D4DD

da zwar DDRD4, allerdings es keine Rechtsableitung NRDD gibt. Auch

14D4N4NDNN

ist inkorrekt. In unserer Java-Implementierung haben wir dieses Problem händisch gelöst, indem wir der Regel NDN den Vorzug vor DN gegebene haben. Im allgemeinen müssen wir definieren, was ein korrekter Linksreduktionsschritt ist. Und dann überlegen, wie wir herausfinden, ob ein Linksreduktionsschritt korrekt ist. Diese Fragen werden uns für den Rest dieses und des nächsten Teilkapitels beschäftigen.

Definition 6.7.2 (Gültige Wortform, korrekter Reduktionsschritt) Eine Wortform γ(ΣN) heißt gültig, wenn es eine Rechtsableitung SRγ gibt. Ein Linksreduktionsschritt αβwαXw heißt korrekt, wenn αXw gültig ist. In diesem Fall ist natürlich αβw selbst gültig.

Den Präfix α nennen wir eine Front der gültigen Wortform αβw. Wenn die Grammatik eindeutig ist, dann hat jede gültige Wortform γ genau eine Front, die wir mit front(γ) bezeichnen.

Wenn wir uns erinnern, wie wir in den letzten zwei Teilkapiteln informell LR-Parser entworfen und implementiert haben, dann sehen wir, dass in einem Linksreduktionsschritt αβwαXw die Front αβ der Stackinhalt ist und w der bis jetzt ungelesene Teil des Eingabewortes. Wir wünschen wir uns folgendes:

Wunsch. Ob αβwαXw gültig ist oder nicht, wollen wir allein auf Grund der Front αβ entscheiden können, das heißt, ohne w betrachten zu müssen.

Wir haben allerdings bereits gesehen, dass das nicht immer möglich ist. Bei der Implementierung von ArithmeticGrammar.java zum Beispiel haben wir manchmal das erste Zeichen von w betrachten müssen. Allerdings behalten wir erst einmal obigen Wunsch als Idealziel. Um ihn zu formalisieren, fragen wir uns, wann es denn nicht möglich ist, ohne Betrachten von w zu eintscheiden, ob αβwαXw gültig ist.

  • Schlechter Fall 1: Es gibt für eine Wortform γ zwei korrekte Linksreduktionsschritte: γγ und γγ. In diesem Falle gäbe es zwei verschiedene Rechtsableitungen SRγRγRwΣSRγRγRwΣ

    (wir nehmen an, dass man aus jedem Nichtterminal mindestens ein Wort uΣ ableiten kann; andernfalls kann man solche nutzlosen Nichtterminale eliminieren). Das Wort w hat also zwei verschiedene Ableitungsbäume. Die Grammatik ist somit mehrdeutig. Mit uneindeutigen Grammatiken beschäftigen wir uns zunächst gar nicht; sie sind von einem praktischen Standpunkt aus auch unattraktiv: wenn z.B. eine Programmiersprache eine mehrdeutige Grammatik hätte, dann wäre ja für gewisse Programme nicht eindeutig festzustellen, was damit gemeint ist. Wir nehmen also an, dass die Grammatik G eindeutig ist und somit dieser Fall nicht eintreten kann.

  • Schlechter Fall 2: Der Linksreduktionsschritt αβwαXw ist korrekt, aber für ein anderes wΣ ist αβwαXw

    nicht korrekt, obwohl αβw eine gültige Wortform ist. Dieser Fall ist schlecht, weil der Parser nur αβ gelesen hat und somit nicht weiß, ob es sich bei der gesamten Wortform um αβw oder um αβw handelt. Da beide gültig sind, können ja auch beide in einer Linksreduktion auftreten. Korrektheit hängt also davon ab, was weiter rechtskommt.

  • Beispiel 6.7.3 Erinnern Sie sich: unsere obige Grammatik S1aSS2XX3aXbX4ab . ist eindeutig (das ist leicht zu sehen), allerdings tritt Schlechte Fall 2 ein: der Reduktionsschritt aaXaaS ist korrekt (hier also w=ϵ), aber leider ist aaXbaaSb nicht korrekt (hier w=b), da aaXb gültig ist, aaSb aber nicht. Die Entscheidung für eine Reduktionsregel kann also nicht ohne Wissen über das, was dahinter kommt, getroffen werden.

    Wir definieren nun eine Klasse von Grammatiken, bei denen diese schlechten Fälle nicht auftreten.

    Definition 6.7.4 (LR(0)-Grammatiken) Eine kontextfreie Grammatik heißt LR(0)-Grammatik, wenn keiner der obigen schlechten Fälle eintritt. Formal, wenn (1) die Grammatik eindeutig ist und (2) wenn ein korrekter Linksreduktionsschritt αβwαXw bedeutet, dass auch alle anderen Linksreduktionsschritte αβwαXw korrekt sind, sofern wΣ ist und αβw selbst eine gültige Wortform ist.

    In Worten/Graustufen: wenn wir αβwαXw guten Gewissens anwenden dürfen, ohne auch nur ein Zeichen von w gelesen zu haben, sofern wir sicher sind, dass es irgendein w gibt, das αβw zu einer gültigen Wortform macht.

    Lemma 6.7.5 (LR(0), äquivalente Formulierung). Eine Grammatik G ist LR(0) genau dann, wenn für alle korrekten Linksreduktionsschritte αβwαXw und αβwαXw gilt:

    1. Falls αβ=αβ dann auch β=β und X=X; in Worten: wenn die Fronten identisch sind, dann auch die Reduktionsschritte.
    2. Wenn αβ=αβφ und |φ|1, dann φΣ; in Worten: wenn front(γ) ein echter Präfix von front(γ) ist, dann muss in dem überstehenden Teil von front(γ) mindestens ein Nichtterminal vorkommen.

    Beweis. Der Beweis ist leider etwas mechanisch und repetitiv. Aber vielleicht ist es eine gute Übung, ihn genau durchzugehen, um die Definitionenen Linksreduktion, gültige Wortform etc. zu verinnerlichen. Ich bin auch immer noch auf der Suche nach einem knapperen, klareren Beweis, der nicht so viele Fallunterscheidungen enthält.

    Wenn-Dann-Richtung. Wenn G eine LR(0)-Grammatik ist, dann gelten die Schlussfolgerungen des Lemmas.

    Beweis. Um Punkt 1 zu zeigen, nehmen wir an, dass αβ=αβ gilt. Da αβwαXw korrekt ist, αβw eine gültige Wortform ist und G eine LR(0)-Grammatik ist, so ist auch

    αβw=αβwαXw

    ein korrekter Linksreduktionsschritt. Also sind αβwαXw und αβwαXw beides korrekte Linksreduktionsschritte. Da G eindeutig ist, kann es nur eine Rechtsableitung geben, d.h. αXw=αXw, was X=X und somit β=β impliziert.

    Um Punkt 2 zu zeigen, nehmen wir an, dass αβ=αβφ gilt. Falls - entgegen der Schlussfolgerung - nun φΣ gälte, wäre

    αβw=αβφwαXφw

    ein korrekter Linksreduktionsschritt; nach Voraussetzung ist auch αβwαXw korrekt. Es gäbe also zwei korrekte Linksreduktionsschritte und G wäre nicht eindeutig. Wir folgern, dass φΣ. Beachten Sie, dass es, wenn φ Nichtterminale enthält, keinen Widerspruch gibt: dann ist nämlich αβφwαXφw gar kein Linksreduktionsschritt, geschweige denn ein korrekter.

    Nur-dann-Richtung. Wenn die Grammatik G die Schlussfolgerungen des Lemmas erfüllt und müssen zeigen, dass sie auch LG(0).

    Beweis. Als erstes zeigen wir, dass G eindeutig ist; dass es also für jede gültige Wortform genau einen korrekten Linksreduktionsschritt gibt. Dafür nehmen wir dann, dass es von γ aus die Linksreduktionsschritte

    γ=αβwαXw undγ=αβwαXw und

    gibt und müssen zeigen, dass es sich in der Tat um denselben Schritt handelt. Ohne Beschränkung der Allgemeinheit ist |αβ||αβ| und wir schreiben αβ=αβφ. Da φ ein Präfix von w ist und wΣ, so gilt auch φΣ. Nach Punkt 2 der Schlussfolgerung muss also φ=ϵ gelten. Es ist also αβ=αβ. Nach Punkt 1 der Schlussfolgerung gelten nun also auch α=α, β=β und X=X und somit auch w=w. Es handelt sich um ein und den selben Linksreduktionsschritt. Die Gramatik ist eindeutig.

    Um den zweiten Punkt der LR(0)-Eigenschaft zu zeigen, nehmen wir an, dass

    αβwαXw

    ein korrekter Linksreduktionsschritt ist und γ:=αβw eine gültige Wortform ist mit wΣ. Wir müssen zeigen, dass αXw auch gültig ist. Da G eindeutig ist, gibt es einen eindeutigen korrekten Linksreduktionsschritt

    γ=αβwαXw

    Da αβ und αβ beides Präfixe von γ sind, gibt es drei Fälle: (1) αβ=αβ; (2) αβ=αβφ mit φϵ; (3) αβ=αβφ mit φϵ.

    (1) Wenn nun αβ=αβ gilt, dann sind nach Punkt 1 der Schlussfolgerung α=α und β=β und X=X; also ist γ=αβw=αβw und auch γ=αβw und somit w=w. Somit ist αXw=αXw und letztere ist eine gültige Wortform.

    (2) Wir haben zwei korrekte Linksreduktionsschritte αβwαXw und αβwalphaXw. Nach Punkt 2 der Schlussfolgerung des Lemmas φ mindestens ein Nichtterminal enthalten. Das kann aber nicht sein, da φ ein Präfix von w ist. (3) kann aus dem gleichen Grund nicht gelten.

    Wir haben nun beide Richtungen gezeigt und somit das Lemma bewiesen.

    Übungsaufgabe 6.7.1 Zeigen Sie, dass die folgende Grammatik LR(0) ist: SaSSBcBaBbBab Als ersten Schritt sollten Sie sich überlegen, wie gültige Wortformen überhaupt aussehen können.
    Übungsaufgabe 6.7.2 Wir ändern die Grammatik etwas ab: SaSSBBaBbBab Die erzeugte Sprache ist {aambm | m1}. Zeigen Sie, dass die Grammatik nicht LR(0) ist.
    Übungsaufgabe 6.7.3 Zeigen Sie, dass die folgende Grammatik LR(0) ist: SaSSBCBaBbBabCcCCcTTabCTab Als ersten Schritt sollten Sie sich überlegen, wie gültige Wortformen überhaupt aussehen können.

    Algorithmische Fragen

    Es stellen sich unmittelbar zwei zentrale Fragen:
    1. Wie können wir verifizieren, ob eine gegebene Grammatik die LR(0)-Bedingung erfüllt?
    2. Falls sie es tut, wie können wir für eine gegebene gültige Wortform γ den korrekten Reduktionsschritt γ=αβwαXw finden? Insbesondere die Zerlegung in γ=αβw?

    Beide Aufgaben können mit Hilfe eines endlichen Automaten, des DK-Automaten erledigt werden (DK steht als Abkürzung für Donald Knuth, der als erstes diese Idee hatte).

    Hinweis. Was nun folgt, ist mathematisch recht herausfordernd. Lesen Sie daher gerne auch das Kapitel 2.4 (Deterministic context free languages) im Lehrbuch Introduction to the Theory of Computing von Michael Sipser. Meine Darstellung des doch recht schwierigen Materials fußt auf diesem Kapitel, weicht aber doch stark genug von Sipser ab, so dass es womöglich hilfreich ist, beides zu lesen: dieses Vorlesungsskript und das Kapitel in Sipers Buch.