Gibt es eine Möglichkeit, zwischen LL (k) - und LR (k) -Grammatik zu unterscheiden?

12

Ich studiere vor kurzem über das Entwerfen von Compilern. Ich habe zwei Arten von Grammatik kennengelernt: die LL-Grammatik und die LR-Grammatik.

Wir kennen auch die Tatsachen, dass jede LL-Grammatik LR ist, das heißt, LL-Grammatik ist eine richtige Teilmenge der LR-Grammatik. Die erste Methode wird beim Parsen von oben nach unten und die zweite beim Parsen von unten nach oben verwendet.

Aber gibt es eine Möglichkeit, zu sagen, dass eine bestimmte Grammatik LL oder LR ist?

Deb
quelle
3
Wie wäre es mit der Verwendung der kanonischen Techniken, um die und L R ( k ) -Tabellen zu generieren und zu überprüfen, ob sie Konflikte enthalten? L L ( 1 ) und L R ( 1 ) werden normalerweise in einem Standardlehrbuch zum Parsen behandelt; Die Techniken L L ( k ) und L R ( k ) sind etwas schwieriger zu finden, aber auch bekannt. LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
Alex ten Brink
@AlextenBrink Das hört sich so an, als könntest du eine Antwort geben! (Willkommen zurück, du
Raphael
Mit kanonischer Technik zu überprüfen, ob eine Grammatik LL oder LR ist, ist richtig, aber ein langer Weg. Ich versuche einen kleinen Weg zu finden, den ich im Buch der Compiler von Aho-Lam-Sethi-Ullman gefunden habe.
Deb

Antworten:

11

und L R ( k ) -Grammatiken sind nicht nur deshalb schön, weil sie effizient analysiert werden können, sondern auch, weil wir überprüfen können, ob eine Grammatik L L ( k ) oder L R ( k ) ist.LL(k)LR(k)LL(k)LR(k), und weil wir Tabellen für sie generieren können (Analysetabellen werden zum Analysieren von Eingabezeichenfolgen verwendet). Beachten Sie, dass Sie bei diesen beiden Klassen anhand der Analysetabelle sofort überprüfen können, ob die Grammatiken in den Klassen enthalten sind, da dies genau dann der Fall ist, wenn die Tabellen keine Fehler enthalten. Ja, es gibt auch Grammatikklassen, die wir effizient analysieren können, wenn wir eine Analysetabelle haben, für die wir die Tabelle jedoch nicht generieren können, wenn sie existiert.

In jedem Lehrbuch über Parsing-Methoden erfahren Sie, wie Sie Tabellen für -Methoden und möglicherweise auch für L R ( 1 ) generieren (obwohl S L R ( 1 ) häufiger vorkommt). Lehrbücher wie Parsing Theory von Sippu und Soisalon-Soininen behandeln auch die Generierung von Analysetabellen für L L ( k ) - und L R ( k ) -Grammatiken.LL(1)LR(1)SLR(1)LL(k)LR(k)

LL(k)LR(k)LL(1)kLL(k)LR(k)oder nicht, die in polynomialer Zeit ablaufen (Tabellengenerierung ist exponentiell). Für Details lesen Sie das Lehrbuch oben. Beachten Sie, dass die Tabelle in vielen Fällen eine angemessene Größe hat, sodass der Test nicht erforderlich ist.

kkLL(k)LR(k)LR(k)kLL(c)ck(siehe hier für Details).

Alex ten Brink
quelle
Wissen Sie zufällig, wo ich die Details des Polynom-Zeit-Algorithmus finden kann, um zu testen, ob eine Sprache LR (k) ist (abgesehen vom Kauf des Lehrbuchs)?
user541686
2

Wir müssen nur überprüfen, ob eine Grammatik LL ist oder nicht, weil jede LL-Grammatik LR ist, das heißt, LL ist die richtige Teilmenge von LR. Wenn also eine Grammatik LL ist, muss sie LR sein, aber nicht jedes LR ist LL.

Eine Grammatik G ist in LL, wenn wann immer A-> C | D, die folgende Bedingung gelten sollte:

  1. First (C) und First (D) sind disjunkte Mengen.
  2. Wenn leer in First (D) ist, sind First (C) und Follow (A) disjunkte Mengen, ebenfalls leer in First (C).
Deb
quelle