GLL Parser Combinator oder Generator in/für C oder C++ [closed]

Lesezeit: 4 Minuten

Benutzer-Avatar
Jo

Gibt es eine bestehende Implementierung der GLL Algorithmus, entweder in Form von Parser-Kombinatoren (bevorzugt) oder als Parser-Generator für C oder C++?

Meine Anforderungen sind, dass die Ausgabe ein Shared Packed Parse Forest (SPPF) ist, den ich später mit semantischen und/oder kontextuellen Regeln disambiguieren kann. Es gibt andere Parsing-Algorithmen wie GLR, die mit allgemeinen kontextfreien Grammatiken umgehen können, aber alle GLR-Parser-Generatoren, die ich finden konnte, geben entweder den ersten erfolgreichen Parsing-Baum zurück oder schlagen fehl, wenn am Ende eine Mehrdeutigkeit verbleibt.

  • Ich verstehe, dass Bison einen GLR-Schalter hat, aber ich weiß nicht, was seine Eigenschaften sind. Ich bin überrascht, dass diese Tools, die Sie finden könnten, Einwände erhoben, wenn es noch Unklarheiten gibt (wir verwenden GLR-Parser und behalten diese genau, um eine semantische Analyse durchzuführen, wie Sie vorschlagen). Wenn sie das tun, muss es einen Moment geben, in dem sie die gesamten Baummehrdeutigkeiten und alles haben; Sie sollten in diesem Moment eintreten und den Baum nehmen können.

    – Ira Baxter

    17. Januar 2014 um 23:12 Uhr

  • Laut dem Bison-Homepagesein GLR-Parser ist zeitlich exponentiell (dh er ist nicht korrekt implementiert, da ein GLR-Parser mit den richtigen Datenstrukturen O(n³) ist)

    – Jo

    18. Januar 2014 um 1:23 Uhr

  • Haben Sie einen Earley-Parser als Alternative zu einem GLL-Parser in Erwägung gezogen? Marpa ist ein Earley-Parser für Perl, der über eine C-Bibliothek implementiert ist.

    – Hippiepfad

    19. September 2014 um 14:42 Uhr

  • Hast du gesehen sourceforge.net/projects/cocom (Dokumente bei cocom.sourceforge.net/ammunition++-13.html )

    – Jerry Jeremia

    13. August 2015 um 0:58 Uhr

  • @EvgeniyZh Scala ist nicht C++

    – Jo

    30. August 2015 um 7:16 Uhr

Was wäre, wenn du es ausprobierst GLL Kombinatoren? Obwohl es Scala verwendet, können Sie mithilfe von “dünne” Wrapper dafür schreiben JNI.

GLL Kombinatoren ist ein Framework zur Implementierung von GLL-Parsing-Algorithmus
(Scott und Johnstone, LDTA 2009) in funktionaler Weise. Genauer gesagt verwendet das Framework atomare Parser-Kombinatoren, um Grammatiken zusammenzustellen, die dann unter Verwendung des GLL-Algorithmus ausgewertet werden. Das Framework bietet eine Syntax für diese Aufgabe, die fast identisch mit der des in Scala integrierten Parser-Combinator-Frameworks ist. Zum Beispiel können wir die klassische “Klammern-Grammatik” mit GLL-Kombinatoren rendern:

lazy val expr: Parser[Any] = (
    "(" ~ expr ~ ")"
  | ""
)

Wie die Typenanmerkung impliziert, expr verweist auf eine Instanz des Typs
Parser[Any]. Das heißt, ein atomarer Parser, der einige Eingaben verbraucht und einen Wert vom Typ zurückgibt Any. Wir können diesen Parser gegen a aufrufen String wie folgt eingeben:

expr("((()))")

Dies gibt einen Wert vom Typ zurück Stream[Result[Any]]. Das Result[A] ADT ist wie folgt definiert (für einige Typen A):

  • Success[A] — Stellt eine erfolgreiche Analyse dar und enthält den resultierenden Wert.
  • Failure — Stellt eine fehlgeschlagene Analyse dar und enthält die relevante Fehlermeldung sowie den Rest des Analysestroms (die Zeichen, die nicht verbraucht wurden).

Wenn ein Ergebnis erfolgreich ist (d. h. eine Instanz von Success[A]), dann werden keine Fehler zurückgegeben. Und so kam es dass der Stream zurückgegeben wird vollständig homogen, enthält entweder Success oder Failure, aber nicht beide. EIN Stream wird anstelle eines einzelnen Werts zurückgegeben, um Mehrdeutigkeiten in der Grammatik zu berücksichtigen (siehe unten).

Es ist erwähnenswert, dass GLL eine Form von ist rekursive Abstiegsanalyse. Es hat alle Vorteile des herkömmlichen rekursiven Abstiegs, einschließlich eines intuitiven Kontrollflusses, willkürlicher Positionierung semantischer Aktionen und überlegener Fehlermeldungen. Tatsächlich ist es die Tatsache, dass GLL rekursiv absteigt, was es ermöglicht, es unter Verwendung von atomaren Kombinatoren zu implementieren. Andere Algorithmen, die die gleichen Fähigkeiten wie GLL haben (wie GLR, Earley Parsing usw.), sind aufgrund ihres höchst unintuitiven Steuerflusses grundsätzlich nicht mit dem Kombinatormodell kompatibel. Beim GLL-Parsing folgt der Kontrollfluss dem der Grammatik, wie es bei herkömmlichen Parser-Kombinatoren oder jeder anderen Form von rekursivem Abstieg der Fall ist.

  • Ich bezweifle sehr, dass es das gibt irgendein vernünftiges Mapping für die Kombinatoren selbst über JNI.

    – Jo

    21. September 2015 um 10:44 Uhr

  • @Joe: Nicht für die Kombinatoren selbst, nein. Das ist einfach Unsinn. Ich dachte, Sie könnten eine Art Wrapper erstellen im Schema das macht die Aufrufe für C/C++-Code einfacher. und rufen Sie diese Funktionen über JNI auf

    – 3442

    21. September 2015 um 11:01 Uhr

1094160cookie-checkGLL Parser Combinator oder Generator in/für C oder C++ [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy