Ich versuche, ant ANTLR3-Grammatik zu einem ANTLR4-Grammatik , um es mit der antlr4-python2-Laufzeitumgebung zu verwenden. Diese Grammatik ist ein C / C ++ - Fuzzy-Parser.
Nachdem ich es konvertiert habe (indem ich im Wesentlichen Baumoperatoren und semantische / syntaktische Prädikate entfernt habe), habe ich die Python2-Dateien mit folgendem Befehl erstellt:
java -jar antlr4.5-complete.jar -Dlanguage=Python2 CPPGrammar.g4
Und der Code wird ohne Fehler erzeugt, also importiere ich ihn in mein Python-Projekt (ich verwende PyCharm), um einige Tests durchzuführen:
%Vor% Das Problem ist, dass das Parsing sehr langsam ist. Bei einer Datei mit ~ 200 Zeilen dauert es mehr als 5 Minuten, während die Analyse der gleichen Datei in antlrworks nur 1-2 Sekunden dauert.
Beim Analysieren des antlrworks-Baums habe ich festgestellt, dass die expr
-Regel und alle ihre Nachkommen sehr oft aufgerufen werden, und ich denke, dass ich diese Regeln vereinfachen / ändern muss, damit der Parser schneller läuft:
Ist meine Annahme korrekt oder habe ich beim Konvertieren der Grammatik einen Fehler gemacht? Was kann getan werden, um das Parsen so schnell wie bei antlrworks zu machen?
UPDATE: Ich habe die gleiche Grammatik nach Java exportiert und brauchte nur 795ms, um das Parsing zu vervollständigen. Das Problem scheint mehr mit der Python-Implementierung als mit der Grammatik selbst zu tun zu haben. Gibt es etwas, was getan werden kann, um Python-Parsing zu beschleunigen? Ich habe hier gelesen, dass Python 20-30 Mal langsamer sein kann als Java, aber in meinem Fall Python ist ~ 400 mal langsamer!
Ich war mit einem ähnlichen Problem konfrontiert, also entschied ich mich, diesen alten Beitrag mit einer möglichen Lösung zu knacken. Meine Grammatik lief sofort mit dem TestRig, war aber auf Python 3 unglaublich langsam.
In meinem Fall war der Fehler das nicht-gierige Token, das ich verwendet habe, um eine Zeile Kommentare zu erzeugen (doppelter Schrägstrich in C / C ++, '%' in meinem Fall):
%Vor%Dies wird von diesem Beitrag von sharwell in dieser Diskussion hier etwas unterstützt: Ссылка
Wenn die Leistung ein Problem darstellt, vermeiden Sie die Verwendung nicht-gieriger Operatoren, insbesondere in Parser-Regeln.
Um dieses Szenario zu testen, möchten Sie vielleicht nicht-gierige Regeln / Token aus Ihrer Grammatik entfernen.