Gibt es eine andere Lösung für das Problem "Dangling else" als "Match Nearest"?


9

Die folgende kontextfreie Grammatik zeigt eine Mehrdeutigkeit vom Typ "Dangling else" (stellen Sie sich vor, steht für und b steht für und c steht für eine andere Art von Anweisung oder Block): S.aif expr thenbelsec Zum Beispiel kannaacbcals(a(acbc))oder als(a(ac)bc)analysiert werden(dies ist das einfachste / kürzeste mehrdeutige Wort für diese Grammatik).

SaSbS|aS|c
aacbc(a(acbc))(a(ac)bc)

Die "Standard" -Methode zum Auflösen dieser "baumelnden anderen" Mehrdeutigkeit zwingt die "sonst" ( ) -Anweisung dazu, sich mit dem nächsten / innersten "Wenn-Dann" ( a ) zu paaren . Dies kann wie folgt erreicht werden: S.ba Diese Grammatik ist eindeutig. Im obigen Beispiel wird dasParsen(a(acbc))erzwungen.

SaTbS|aS|cTaTbT|c
(a(acbc))

Frage: Gibt es einen anderen natürlichen Weg, um die Mehrdeutigkeit aufzulösen, die das Parsen von a a c b c erzwingen würde ? Mit anderen Worten, ich suche nach einer Grammatik, die dieselbe Sprache wie die beiden oben genannten erzeugt, die eindeutig ist und a a c b c als ( a ( a c ) b c ) analysiert .(a(ac)bc)aacbcaacbc(a(ac)bc)

Bemerkung: Mein erster Versuch war wie folgt: , das die Mehrdeutigkeit vonaacbcnach Bedarfauflöst- aber diese Grammatik ist immer noch mehrdeutig:aacbacbckann analysiert werden als(a(ac)b(acbc))oder als(a(acb(ac))bc).

SaSbS|aU|cUaU|c
aacbcaacbacbc(a(ac)b(acbc))(a(acb(ac))bc)

1
Und in Ihrem letzten Beispiel, welche der beiden möglichen Parsen betrachten Sie als "natürlich" oder richtig und warum?
Rici

@rici Ja, das ist eine knifflige Frage!, und ich weiß es nicht. Ich werde mit einer eindeutigen Grammatik zufrieden sein, die entweder das Parsen von . Was ich vor allem interessiert , ist etwa , dass ein ein a ... a a a c b c b c ... b c (mit mehr ein 's als b ' s) entspricht der k - ten letzten b mit dem k - ten ein (und Blätter der innerste a ist unübertroffen). aacbacbcaaaaaacbcbcbcabkbkaa
Gro-Tsen

Antworten:


7

ababcb

Die traditionelle "Match Nearest" -Dangling-else-Auflösung entspricht jedem Abschluss mit dem neuesten, noch nicht übereinstimmenden Open. Das bedeutet, dass es zwischen einem übereinstimmenden Öffnen und seinem übereinstimmenden Schließen niemals ein unübertroffenes Öffnen (oder Schließen) gibt.

(()())

Dieser Abgleich muss von außen nach innen erfolgen, damit erst dann ein Abgleich für einen Abschluss versucht wird, wenn alle umschließenden Paare abgeglichen wurden. Diese Tatsache macht es unmöglich, eine Analyse mit einem Bounded-Lookahead-Algorithmus zu erstellen, da die Analyse von beiden Enden nach innen arbeiten muss, nachdem die Zeichenfolge in vollständig übereinstimmende Segmente aufgeteilt wurde (da diese den Bereich potenzieller Übereinstimmungen effektiv einschränken).

Die Tatsache, dass es keinen Online-Parser von links nach rechts gibt, bedeutet jedoch nicht, dass es keine eindeutige CFG gibt. (Offensichtlich: Eine palindromische Sprache muss von beiden Enden zur Mitte hin analysiert werden, aber es ist einfach, eine eindeutige Grammatik zu schreiben.)

Um eine Grammatik für das Klammerproblem "am weitesten übereinstimmend" zu erstellen, habe ich mich auf die Tatsache verlassen, dass auf ein nicht übereinstimmendes Öffnen kein übereinstimmendes Öffnen folgen kann. Wenn dies der Fall wäre, würde die am weitesten übereinstimmende Eigenschaft nicht zutreffen, da das nicht übereinstimmende Öffnen mit dem Schließen des übereinstimmenden Open übereinstimmen könnte. Die Tatsache, dass es nicht übereinstimmt, verstößt also gegen die am weitesten übereinstimmende Eigenschaft.

Hier ist also die etwas klobige Grammatik:

SU|MUT|aUbT|aUbc|aMbUMaMbM|cTaT|ac

SMUaTaTTUUT

UUSMUSMUMU

Wahrscheinlich gibt es eine bessere Problemumgehung als die, die ich gewählt habe. Aber dieser scheint zu funktionieren, und er spielt gut mit Bisons GLR-Parser, mit dem ich ihn getestet habe. Dieser Parser beschwert sich über mehrdeutige Analysen, es sei denn, Sie schreiben zusätzlichen Code, um mit der Mehrdeutigkeit umzugehen, und ich war zu faul, dies zu tun. Ich habe es mit Zeichenfolgen von bis zu 20 Öffnen + Schließen getestet, und es scheint eine eindeutige Analyse für jede korrekt verschachtelte Sequenz erzeugt zu haben, ohne Parsen für falsch verschachtelte Sequenzen zu erstellen.


Herzlichen Glückwunsch zu dem, was ich festgestellt hatte, war wahrscheinlich unmöglich! Ich habe experimentell überprüft, dass diese Grammatik für Wörter mit einer Länge von ≤ 16 tatsächlich eindeutig ist und dieselben Wörter wie die in meiner Frage erzeugten erzeugt. Jetzt muss ich im Detail verstehen, wie es funktioniert!
Gro-Tsen

SaSbT|aMbSMTaT|cU

0

Nimm a + b + c + d + e und abcde. Es gibt zwei offensichtliche Möglichkeiten, wie eine Grammatik diese analysieren könnte, aber es gibt eine Möglichkeit, die wir verwenden.

Im Fall des "baumelnden Anderen" sehen die Leute das nicht so. Stattdessen wird die Syntax als "if" interpretiert, gefolgt von null, einem oder mehreren "else if", gefolgt von einem optionalen "else".


acbacbacbc
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.