如何分析Antlr语法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何分析Antlr语法相关的知识,希望对你有一定的参考价值。
我有一个Antlr语法,目前大约有1200行。它解析我想要的语言,但对于至少一个构造,即使对于较小的输入文件,它也非常慢。对于构造的每个添加元素,执行时间似乎呈指数增长。
我想知道是否有任何关于调试/分析此类性能问题的良好指导。
我已经尝试过使用VisualVM,它给出了两个方法closureCheckingStopState和closure_的名称,但这并没有更接近于弄清楚语法有什么问题。
我依靠两个主要项目来分析和提高语法的性能。
- 最新版本的ANTLRWorks 2包括高级分析功能。目前的限制包括:
分析器不支持需要自定义
CharStream
或TokenStream
的语言(例如,用于预处理输入)。 探查器不会在词法分析器或解析器中执行自定义嵌入式操作,因此您的语法需要能够生成解析树而不依赖于这些操作。标准词法分析器命令(如-> skip
或-> channel(HIDDEN)
)不会造成问题。 分析器的输出是大多数ANTLR用户不易理解的数字表,特别是在知道响应数字时应该做什么方面。 - 我使用的是fork of the primary release,其中包括ANTLR 4参考版本中没有的一些优化。请注意,这些功能是“谨慎”记录的,因为它们迄今为止的唯一目的是支持ANTLRWorks和GoWorks的内部开发。对于大多数语法,此fork的执行大致相当于引用版本。但是,对于某些已知的语法,“优化”版本的执行速度超过参考版本的200倍。
如果你能提供特别的语法和输入,我可以运行分析并尝试解释结果的关键部分。
最新版本的ANTLRWorks通过官方NetBeans更新中心进行分发。只需运行工具→插件,转到可用插件并找到ANTLRWorks编辑器。
要运行探查器,请使用Run→Interpret Parser ...命令。解析操作后,通过选择Window→Parser Debugger Controller,可以使用结果窗口。
JetBrains IDEA插件中有一个Profiler选项
见:https://github.com/antlr/intellij-plugin-v4/blob/master/README.md
右键单击任何规则来测试规则,您将获得标签
- 解析树
- 等级制度
- 简介
请参阅下面的示例屏幕截图
探查器选项卡中的歧义线有助于查找不明确的解析规则。如果单击这样一条红线,则会突出显示该规则。
正如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());
}
}
如果您已经安装了android Studio,则可以使用内置的Antlr V4插件来使用Antlr Profiler。
用于测试的Android Studio版本:2.3.1
以上是关于如何分析Antlr语法的主要内容,如果未能解决你的问题,请参考以下文章
ANTLR4 词法分析器规则在 perl 语法上产生错误或冲突