如何分析Antlr语法

时间:2014-04-19 18:11:38

标签: parsing antlr antlr4

我有一个Antlr语法,目前大约有1200行。它解析我想要的语言,但对于至少一个构造,即使对于较小的输入文件,它也非常慢。对于构造中每个添加的元素,执行时间似乎呈指数级增长。

我想知道是否有任何关于调试/分析此类性能问题的良好指导。

我已经尝试过使用VisualVM,它给出了两个方法closureCheckingStopState和closure_的名称,但这并没有更接近于弄清楚语法有什么问题。

4 个答案:

答案 0 :(得分:3)

JetBrains IDEA插件中有一个Profiler选项

请参阅: https://github.com/antlr/intellij-plugin-v4/blob/master/README.md

右键单击任何规则以测试规则,您将获得

的选项卡
  • 解析树
  • 层次结构
  • 概述

请参阅下面的示例屏幕截图。

“探查器”选项卡中的歧义线有助于查找不明确的解析规则。如果单击这样一条红线,则会突出显示规则。

个人资料标签 Profile Tab

解析树标签 ParseTree Tab

答案 1 :(得分:1)

我依靠两个主要项目来分析和提高语法的表现。

  1. 最新版本的ANTLRWorks 2包括高级分析功能。目前的限制包括以下内容:

    • 该探查器不支持需要自定义CharStreamTokenStream的语言(例如,用于预处理输入)。
    • 探查器不会在词法分析器或解析器中执行自定义嵌入式操作,因此您的语法需要能够生成解析树而不依赖于这些操作。标准词法分析器命令(例如-> skip-> channel(HIDDEN))不会造成问题。
    • 分析器的输出是数字表,大多数ANTLR用户都不容易理解,尤其就知道你应该如何回应这些数字而言。
  2. 我使用fork of the primary release,其中包括ANTLR 4参考版本中没有的一些优化。请注意,这些功能是“谨慎”记录的,因为它们迄今为止的唯一目的是支持ANTLRWorks和GoWorks的房屋开发。对于大多数语法,此fork的执行大致相当于引用版本。但是,对于某些已知的语法,“优化”版本的执行速度是参考版本的200倍。

  3. 如果您能提供特别的语法和输入,我可以运行分析并尝试解释结果的关键部分。


    最新版本的ANTLRWorks通过官方NetBeans更新中心进行分发。只需运行工具→插件,转到可用插件,然后找到 ANTLRWorks编辑器

    要运行探查器,请使用运行→解释分析器... 命令。解析操作后,通过选择 Window→Parser Debugger Controller ,可以使用结果窗口。

答案 2 :(得分:1)

正如Wolfgang Fahl所说,IDEA有一个很棒的插件,但是当然只显示解析器收集的信息。

因此,如果您无法使用IDEA,或者例如想要实时进行性能分析,则可以通过编程方式进行,例如:

public void parseAndProfile(GmmlSaneParser parser) {
    parser.setProfile(true);

    // do the actual parsing

    ParseInfo parseInfo = parser.getParseInfo();
    ATN atn = parser.getATN();
    for (DecisionInfo di : parseInfo.getDecisionInfo()) {
        DecisionState ds = atn.decisionToState.get(di.decision);
        String ruleName = GmmlParser.ruleNames[ds.ruleIndex];

        System.out.println(ruleName +" -> " + di.toString());
    }
}

答案 3 :(得分:0)

如果您已经拥有Android Studio,则可以使用内置的Antlr V4插件来使用Antlr分析器。

链接中的教程对我有用 http://blog.dgunia.de/2017/10/26/creating-and-testing-an-antlr-parser-with-intellij-idea-or-android-studio/

用于测试的Android Studion版本:2.3.1