Python-Implementierung von Parsec?
-
01-07-2019 - |
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-ModulDa, 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.
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
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.