Entfernen der linken Rekursion in der Grammatik unter Beibehaltung der linken Zuordnung des Operators

13

Ich habe ein Problem mit dieser Übung:

Sei G die folgende mehrdeutige Grammatik für den λ-Kalkül:

E → v | λv.E | EE | (E)

wobei E das einzelne nicht-terminale Symbol ist, λv.E die Abstraktion der Variablen v in E darstellt und EE die Anwendung darstellt.

  1. Definieren Sie eine LL (1) -Grammatik G 'so, dass L (G') = L (G) ist und die Mehrdeutigkeit von G durch Auferlegen der folgenden üblichen Konventionen aufgelöst wird:
    1. Abstraktion ist richtig assoziativ;
    2. Anwendung bleibt assoziativ;
    3. Anwendung hat eine höhere Priorität als Abstraktion.
  2. Zeigen Sie die LL (1) -Parsing-Tabelle für G 'und den Analysebaum, der beim Parsen der Zeichenfolge erhalten wurde λv1. λv2. v1v2v1.

Ich habe die Priorität und Assoziation von Mehrdeutigkeiten beseitigt und diese Grammatik erhalten:

E -> EF | F
F -> λv.G | G
G -> (E) | v

Das ist nicht LL (1), da die Produktion E -> EFrekursiv bleibt. Wenn ich jedoch die linke Rekursion aus dieser Produktion eliminiere, erhalte ich:

E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v

das entspricht nicht der Anforderung 1.2.

Ich habe im Internet nach einer Lösung gesucht, aber es scheint nicht möglich zu sein, die Linksrekursion zu eliminieren, um die linke Assoziativität zu erhalten.

Diese Übung wurde jedoch vor einigen Jahren bei der Compilerprüfung geprüft, daher muss es eine richtige Antwort geben.

Danke für deine Hilfe.

Marco DallaG
quelle

Antworten:

12

Kompatibilität von linker Assoziativität und LL (1) -Parsing

Sie haben gerade eine der Hauptinkonsistenzen bei der Verwendung der kontextfreien (CF) Syntax festgestellt. Die Benutzer möchten Grammatiken so auswählen, dass der Analysebaum die beabsichtigte Struktur des Satzes in der Nähe seiner Semantik widerspiegelt, insbesondere bei nicht assoziativen Operatoren wie der Anwendung . Dies war so ziemlich die ursprüngliche Absicht der CF-Grammatik in der Linguistik. Gleichzeitig beschränken sie sich jedoch auf die Analyse von Technologien, die nur einige Arten von Grammatiken tolerieren.

Wenn der Analysebaum die linke Assoziativität eines Operators widerspiegeln soll, ist die Grammatik notwendigerweise linksrekursiv, da der oberste Anwendungsknoten im Analysebaum notwendigerweise den am weitesten rechts stehenden Begriff von nicht parethesierten aufeinanderfolgenden Anwendungen hinzufügt. LL-Parsing kommt also nicht in Frage. Du hast recht.

Hieraus gibt es zwei Möglichkeiten. Man kann sich nicht darauf verlassen, dass der Parser den richtigen "Analysebaum" angibt, der für spätere Verarbeitungsstufen verwendet werden soll (z. B. zum Reduzieren des Lambda-Ausdrucks hier). Dies führte zu dem Konzept der abstrakten Syntaxbäume (AST), die aus dem Analysebaum erstellt werden können, jedoch eine andere Struktur aufweisen.

Die andere Lösung besteht darin, allgemeinere Analysetechniken zu verwenden, die jede CF-Grammatik akzeptieren, und entsprechend zu analysieren. Allgemeine CF-Parser sind eine gut entwickelte Technologie (und ich frage mich immer wieder, warum LL so beliebt bleibt).

Ich habe keine Ahnung, was als richtige Antwort auf diese widersprüchlichen Anforderungen angesehen werden könnte.

Ich würde zeigen, dass sie den Anforderungen widersprechen. Geben Sie eine erste Grammatik an, die die Assoziativitäts- und Prioritätsbeschränkungen erfüllt, und wandeln Sie dann die Grammatik in eine LL (1) -Grammatik für das Parsen um.

Die Tatsache, dass etwas in einem Tagebuch oder bei einer Prüfung erschien, ist keine Garantie dafür, dass es korrekt ist. Und ich könnte mich auch irren ... aber ich habe einige Überprüfungen durchgeführt, zusätzlich zu meinem eigenen Wissen über das Problem.

Über dieses spezielle Beispiel

Abgesehen davon scheint die erste Grammatik, die Sie vorschlagen, nicht ganz richtig zu sein. Es gibt keine Möglichkeit, λu.λv.v zu erzeugen.

Ein zu wissender Trick besteht darin, mit Operatoren (hier Abstraktion oder Anwendung) mit der niedrigsten Priorität (Abstraktion) zu beginnen. Dies gilt auch für arithmetische Ausdrücke.

babou
quelle
Vielen Dank für Ihren ausführlichen Kommentar. Du hast recht, ich habe einen Fehler mit der ersten Grammatik gemacht, danke auch dafür. Ich werde dann den Professor fragen.
Marco DallaG
Wenn Sie interessiert sind, kann ich die Antwort mit einem kleinen Hinweis zum Grammatikdesign für Dummies (ich auch) ergänzen. Sagen Sie uns auch, was Ihr Professor dazu sagt.
Babou
Ich werde den Thread aktualisieren, wenn der Professor diese Frage beantwortet. Wie auch immer, Sie können gerne weitere Informationen hinzufügen, wenn dies für Sie kein Problem darstellt. Natürlich würde ich das sehr schätzen.
Nochmals vielen
@MarcoDallaG Ist bei der Arbeit an Pierces TAPL darauf gestoßen. Hat Ihr Professor zufällig etwas anderes gesagt als diese Antwort? :)
lcn
0

Mein Versuch:

E  -> A | λv.E
A  -> FA'
A' -> A | ɛ
F  -> (E) | v

Diese Grammatik ist LL (1) und sollte die erforderlichen Eigenschaften berücksichtigen.

Filippo De Bortoli
quelle