我想将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)
问题在于解析速度非常慢。对于包含约200行的文件,需要超过5分钟才能完成解析,而在antlrworks中解析相同文件仅需1-2秒钟。 分析antlrworks树,我注意到
expr
规则及其所有子代被频繁调用,因此我认为需要简化/更改这些规则以使解析器运行更快:
![expr_tree](https://istack.dev59.com/kAmfq.webp)
更新: 我将相同的语法导出到Java中,只需要795毫秒就能完成解析。问题似乎更多地与Python实现有关,而不是与语法本身有关。有什么方法可以加快Python解析速度吗? 我在这里读到python可能比java慢20-30倍,但在我的情况下,python慢了约400倍!
antlr4-python2-runtime
相关的错误,因为在Java上解析相同的文件只需要1秒钟。Python可能会慢一些,但是慢400倍太多了,我认为这不是我的问题。 - Vektor88