Frage

Ich schrieb vor kurzem einen Parser in Python mit Ply (es ist eine Python-Neuimplementierung von yacc). Als ich fast mit dem Parser getan wurde entdeckte ich, dass die Grammatik Ich brauche mich zu analysieren erfordert einige der Lexer zu informieren, während der Analyse nachschlagen zu tun. Ohne einen Blick zu tun, um die Lexer zu informieren ich die Zeichenfolge in der Sprache nicht korrekt analysieren kann.

unter Verwendung eine Nachschlagetabelle in dem Parser-Modul

Da, als ich den Zustand des Lexer aus den Grammatikregeln werde ich denke, steuern kann ich meinen Anwendungsfall werden zu lösen, aber es kann auch schwierig werden, zu halten / Test. Deshalb möchte ich über einige der anderen Optionen kennen.

In Haskell würde ich Parsec, eine Bibliothek mit Parsing-Funktionen (als combinators bekannt). Gibt es eine Python-Implementierung von Parsec? Oder vielleicht eine andere Produktionsqualität Bibliothek volle Funktionalität der Parsen, so kann ich einen kontextsensitiven Parser in Python bauen?

EDIT: Alle meine Versuche, kontextfreie Parsen sind gescheitert. Aus diesem Grund erwarte ich nicht ANTLR nützlich, hier zu sein.

War es hilfreich?

Lösung

Eine Option können Sie prüfen, ob ein LL-Parser Sie in Ordnung ist, zu geben ist ANTLR einen Versuch, es kann python generieren (eigentlich ist es LL (*), wie sie es nennen, * steht für die Menge der Look-Ahead kann es verkraften).

Andere Tipps

Ich glaube, dass pyparsing auf den gleichen Prinzipien wie Parsec basiert.

PySec ist ein weiterer monadischen Parser, ich weiß darüber nicht viel, aber es ist ein Blick wert hier

Es gibt ANTLR, die LL (*) ist, gibt es PyParsing, die mehr Objekt freundlich und ist so etwas wie ein DSL, und dann gibt es Parsen, die wie OCaml der Menhir ist.

Nichts hindert Sie für Ihren Parser aus dem „Kontext freien“ Weg mit PLY abzulenken. Sie können Informationen zu der Lexer während der Analyse, und auf diese Weise erreichen die volle Flexibilität bestehen. Ich bin mir ziemlich sicher, dass Sie alles, was Sie wollen mit PLY auf diese Weise analysieren kann.

Für ein praktisches Beispiel, betrachten - es ist ein Parser für ANSI C in Python mit PLY geschrieben. Sie löst das klassische C typedef -. Kennung Problem (das macht C Grammatik nicht kontextsensitiv) durch eine Symboltabelle in dem Parser bevölkern, die in der Lexer verwendet wird Symbolnamen entweder als Typen zu lösen oder nicht

ANTLR ist groß und hat den zusätzlichen Vorteil, in verschiedenen Sprachen zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top