如何分析Antlr语法

oys*_*yse 8 parsing antlr antlr4

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

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

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

Wol*_*ahl 5

JetBrains IDEA 插件中有一个 Profiler 选项

见:https : //github.com/antlr/intellij-plugin-v4/blob/master/README.md

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

  • 解析树
  • 等级制度
  • 探查器

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

探查器选项卡中的歧义行有助于查找歧义的解析规则。如果您单击这样的红线,则该规则会突出显示。

配置文件选项卡 配置文件选项卡

解析树选项卡 解析树选项卡


Sam*_*ell 2

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

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

    • 探查器不支持需要自定义CharStreamTokenStream(例如用于预处理输入)的语言。
    • 探查器不会在词法分析器或解析器中执行自定义嵌入操作,因此您的语法需要能够在不依赖这些操作的情况下生成解析树。标准词法分析器命令(例如-> skip或 )-> channel(HIDDEN)不会造成问题。
    • 分析器的输出是大多数 ANTLR 用户不容易理解的数字表,特别是在知道应该如何响应这些数字方面。
  2. 我使用主要版本的一个分支,其中包括 ANTLR 4 参考版本中不存在的许多优化。请注意,这些功能“很少”记录,因为迄今为止它们的唯一目的是支持 ANTLRWorks 和 GoWorks 的内部开发。对于大多数语法,此分支的性能大致相当于参考版本。然而,对于某些已知的语法,“优化”版本的执行速度是参考版本的 200 倍以上。

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


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

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