慢速ANTLR4在Python中生成Parser,但在Java中生成速度很快

Vek*_*r88 9 python java parsing antlr antlr4

我试图将ant ANTLR3语法转换为ANTLR4语法,以便将它与antlr4-python2-runtime一起使用.该语法是C/C++模糊解析器.

在转换它(基本上删除树操作符和语义/语法谓词)之后,我使用以下方法生成了Python2文件:

java -jar antlr4.5-complete.jar -Dlanguage=Python2 CPPGrammar.g4

并且生成的代码没有任何错误,所以我在我的python项目中导入它(我使用PyCharm)进行一些测试:

import sys, time
from antlr4 import *
from parser.CPPGrammarLexer import CPPGrammarLexer
from parser.CPPGrammarParser import CPPGrammarParser

currenttimemillis = lambda: int(round(time.time() * 1000))

def is_string(object):
    return isinstance(object,str)

def parsecommandstringline(argv):
    if(2!=len(argv)):
        raise IndexError("Invalid args size.")
    if(is_string(argv[1])):
        return True
    else:
        raise TypeError("Argument must be str type.")

def doparsing(argv):
    if parsecommandstringline(argv):
        print("Arguments: OK - {0}".format(argv[1]))
        input = FileStream(argv[1])
        lexer = CPPGrammarLexer(input)
        stream = CommonTokenStream(lexer)
        parser = CPPGrammarParser(stream)
        print("*** Parser: START ***")
        start = currenttimemillis()
        tree = parser.code()
        print("*** Parser: END *** - {0} ms.".format(currenttimemillis()-start))
        pass

def main(argv):
    tree = doparsing(argv)
    pass

if __name__ == '__main__':
    main(sys.argv)
Run Code Online (Sandbox Code Playgroud)

问题是解析非常慢.使用包含~200行的文件需要5分钟以上才能完成,而在antlrworks中解析同一文件只需要1-2秒.分析antlrworks树,我注意到expr 规则及其所有后代经常被调用,我认为我需要简化/更改这些规则以使解析器运行得更快: expr_tree

我的假设是正确的还是我在转换语法时犯了一些错误?可以做什么来使解析像在antlrworks上一样快?

更新: 我将相同的语法导出到Java,只用了795ms就完成了解析.这个问题似乎与python实现有关,而不是与语法本身有关.有什么办法可以加速Python解析吗?
我在这里读到python可能比java慢20-30倍,但在我的情况下python的速度要快〜400倍!

Pin*_*raf 8

我确认Python 2和Python 3运行时存在性能问题.通过几个补丁,我在python3运行时获得了10倍的加速(~5秒到~400毫秒). https://github.com/antlr/antlr4/pull/1010

  • pull请求已被接受:使用最后一个antlr4 python运行时或等待pypi上的4.5.3版本... (2认同)