Ich kann nicht mit linksrekursiv umgehen, aber PEG-Parser sind heutzutage sehr beliebt. Für Python gibt es https://github.com/erikrose/parsimonious und https://github.com/KuramitsuLab/pegpy.
Ich wollte die Formel analysieren, die im Theorem Proof Support System namens Coq https://coq.inria.fr/ verwendet wird. Also habe ich mir einige der Python-Tools zur Analyse von Phrasen und Syntax angesehen.
Die Grammatik der Coq-Ausdrücke ist ziemlich kompliziert (gemäß der Grammatikdefinition handelt es sich um eine linksrekursive Grammatik [^ 1], die einen Blick nach vorne erfordert). Daher wurden bei der Auswahl die folgenden Punkte verwendet. Wenn Sie mit anderen Grammatiken umgehen möchten, ist dies natürlich ein anderes Kriterium.
Nachfolgend finden Sie die Umfrageergebnisse.
[^ 1]: Eine Grammatik mit Regeln wie "expr :: = expr" + "term". Es ist theoretisch möglich, es in eine Grammatik umzuschreiben, die keine Rekursion hinterlassen hat, aber ich möchte es nicht mit einer großen Grammatik wie Coq tun, und ich möchte keine menschlichen Fehler machen.
pyparsing (2.2.0) 2017/03 Syntaxanalysebibliothek. Ein auf Parser-Kombinatoren basierender Ansatz, der Syntaxanalyseregeln erstellt, indem Klassen wie "OneOf", "Optional" und "Group" kombiniert werden. Es ist sehr einfach, "verschachtelte Kommentare" zu definieren, was bei der grammatikalischen Gestaltung von Programmiersprachen problematisch ist. Es ist sehr einfach, die Sprachklasse anzugeben, aber da die linke rekursive Grammatik nicht so behandelt werden kann, wie sie ist, ist ein gewisser Einfallsreichtum erforderlich. Verwendung von Pyparsing: http://masato.github.io/2014/07/01/python27-etl-pyparsing-syntactic-analysis/
PLY (Python Lex-Yacc) (3.11) 2018/02 Python-Version von Lex / Yacc, einem bekannten Tool zur Analyse von C-Phrasen / Syntax. Dies bedeutet, dass eine ähnliche Grammatikdefinitionssyntax verwendet werden kann. Die LALR (1) -Syntaxanalyse wird grundsätzlich zur Analyse verwendet. Hauptsitz: http://www.dabeaz.com/ply/ Referenz: http://blog.livedoor.jp/shf0811/archives/7346881.html
parse (1.6.6; 2014/11) Eine Mustervergleichsbibliothek, die das Gegenteil von "String.format ()" funktioniert. Referenz: http://coreblog.org/ats/python-parse/
Zusammenfassung,
Scheint gut zu sein.
Außerdem sucht PLY nur nach einem Token. Wenn Sie eine komplizierte Grammatik schreiben möchten, ist dies fast eine Option von ANTLR (Java-Tool), das die LL (*) -Syntaxanalyse verwendet. Zum Beispiel kann die Grammatik von Coq, einem Theorem-Proof-Support-System, von ANTLR leicht analysiert werden. ANTLR v4 kann einen Parser für Python 2/3 generieren. Außerdem scheint der Python-Wrapper von ANTLR in PyPI zu sein.
Recommended Posts