当前位置: 首页 > 知识库问答 >
问题:

在Python中缓慢的ANTLR4生成解析器,但在Java中快速

解晟睿
2023-03-14

我正在尝试将ANTLR3语法转换为ANTLR4语法,以便在ANTLR4-python2-runtime中使用它。该语法是一个C/C模糊解析器。

转换后(基本上删除树运算符和语义/语法谓词),我使用以下方式生成Python2文件:

java-jar antlr4。5-完成。jar-Dlanguage=Python2语法。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)

我的假设是正确的还是在转换语法时犯了一些错误?我们可以做些什么来让解析和AntlWorks一样快?

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

共有3个答案

谯灿
2023-03-14

在这里发布,因为它可能对找到此线程的人有用。

自从发布这篇文章以来,Antlr的Python目标已经有了一些性能改进。也就是说,Python解释器本质上比Java或其他编译语言慢。

我为Antlr的Python3目标组装了一个Python加速器代码生成器。它使用Antlr C目标作为Python扩展。莱克辛

以下是代码生成器工具:https://github.com/amykyta3/speedy-antlr-tool

下面是一个功能齐全的示例:https://github.com/amykyta3/speedy-antlr-example

希望这对那些喜欢在Python中使用Antlr的人有用!

宋运锋
2023-03-14

我面临着一个类似的问题,所以我决定用一个可能的解决方案来撞这篇旧文章。我的语法在TestRig上立即运行,但在Python 3上运行速度非常慢。

在我的例子中,错误是我用来生成单行注释的非贪婪标记(在C/C中为双斜杠,在我的例子中为“%”):

TKCOMM : '%' ~[\r\n]* -> skip ;

这在一定程度上得到了sharwell在这里讨论的帖子的支持:https://github.com/antlr/antlr4/issues/658

当性能是一个问题时,避免使用非贪婪运算符,尤其是在解析器规则中。

要测试此场景,您可能需要从语法中删除非贪婪规则/标记。

马才
2023-03-14

我确认Python2和Python3运行时存在性能问题。通过几个补丁,我在python3运行时的速度提高了10倍(从大约5秒降到大约400毫秒)。https://github.com/antlr/antlr4/pull/1010

 类似资料:
  • 从这里使用Lexer和解析器: https://raw.githubusercontent.com/antlr/grammars-v4/master/java/JavaLexer.g4 https://raw.githubusercontent.com/antlr/grammars-v4/master/java/JavaParser.g4 使用antlr-4.6生成Python3目标 antlr-

  • 我正在尝试使用ANTLRV4为一个简单的自定义语法生成一个lexer和解析器。问题是,当我运行Antlr.jar实用程序时,它生成了一个Lexer文件,而不是一个解析器文件,我认为它应该生成。 简单语法 hellolexer.js hellolexer.tokens 所需输出 hellolexer.js helloparser.js hellolistener.js hellovisitor.js

  • 问题内容: 如果你想要Java中具有加密强度的随机数,请使用。不幸的是,可能会很慢。如果在Linux上使用,它将阻止等待足够的熵建立。你如何避免性能下降? 有没有人使用罕见数学作为解决此问题的方法? 任何人都可以确认在JDK 6中已经解决了此性能问题吗? 问题答案: 如果你想要真正的随机数据,那么不幸的是你必须等待它。这包括 的种子。罕见的数学无法以比更快的速度收集真正的随机数据,尽管它可以连接到

  • 问题内容: 我目前正在阅读Python,目前正在研究生成器。我发现很难回头。 从Java的背景出发,是否有Java的等效语言?这本书讲的是“生产者/消费者”,但是当我听说线程的时候。 什么是发电机,为什么要使用它?显然,无需引用任何书籍(除非您可以直接从书籍中找到一个体面,简单的答案)。也许举一些例子,如果您感到慷慨! 问题答案: 注意:本文采用Python 3.x语法。† 一个发电机仅仅是它返回

  • 我使用antlr4使用Python3生成python目标。antlr语法库中的g4语法文件。生成的Python3Lexer。py文件包含我需要翻译成python的Java代码。这里是它输出的两个java段,您也可以在python3语法文件中找到它们 和 我把这些翻译成: 和 这是我的python脚本,用于运行antlr输出,其中包含python而不是java片段。使用命令运行 It错误并打印以下跟

  • 我正在通过自定义语法处理输入文件,提取标记,并在中返回它们。在ANTLR 3中,我能够通过调用解析器上的方法来解析文件,并获得类似于。 这在ANTLR 4中似乎不起作用。我参考了这本书,似乎我必须调用开始解析,但我在解析器中没有看到任何方法。 我使用ANTLRWorks 2生成我的词法分析器和解析器文件。我没有生成侦听器类。