Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANTLR4性能的起点_Antlr4 - Fatal编程技术网

ANTLR4性能的起点

ANTLR4性能的起点,antlr4,Antlr4,我已经将一个相当大的迁移到,并且达到了一个步骤,除了一些边缘情况外,两个语法中的输出几乎相同。然而,有些文件非常长,无法解析(即使使用SLL预测模式和策略),所以我想知道如何找到应该首先修复哪些规则 我已经用Parser#setProfile()收集了一些统计数据,但我不知道如何解释每个DecisionInfo对象中的结果。关于如何开始优化大型ANTLR4语法,并找到首先要追踪的兔子,有没有好的文档?由于我不知道在DecisionInfo对象中寻找什么,下面是我的发现,并帮助我将解析时间至少提高

我已经将一个相当大的迁移到,并且达到了一个步骤,除了一些边缘情况外,两个语法中的输出几乎相同。然而,有些文件非常长,无法解析(即使使用SLL预测模式和策略),所以我想知道如何找到应该首先修复哪些规则


我已经用Parser#setProfile()收集了一些统计数据,但我不知道如何解释每个DecisionInfo对象中的结果。关于如何开始优化大型ANTLR4语法,并找到首先要追踪的兔子,有没有好的文档?

由于我不知道在DecisionInfo对象中寻找什么,下面是我的发现,并帮助我将解析时间至少提高了一个数量级

首先,我使用
org.antlr.v4.runtime.Parser.setProfile(boolean profile)
对语法启用评测,然后使用
org.antlr.v4.runtime.Parser.get解释器().setPredictionMode(PredictionMode.SLL)
对数千个文件执行解析器,并浏览具有最高预测时间的规则:

Arrays.stream(parser.getParseInfo().getDecisionInfo())
          .filter(decision -> decision.timeInPrediction > 100000000)
          .sorted((d1, d2) -> Long.compare(d2.timeInPrediction, d1.timeInPrediction))
          .forEach(decision -> System.out.println(
                String.format("Time: %d in %d calls - LL_Lookaheads: %d Max k: %d Ambiguities: %d Errors: %d Rule: %s",
                    decision.timeInPrediction / 1000000,
                    decision.invocations, decision.SLL_TotalLook,
                    decision.SLL_MaxLook, decision.ambiguities.size(), 
                    decision.errors.size(), Proparse.ruleNames[Proparse._ATN.getDecisionState(decision.decision).ruleIndex])))
然后通过使用相同的lamba在最高的max lookahead上,除了:

filter(decision -> decision.SLL_MaxLook > 50).sorted((d1, d2) -> Long.compare(d2.SLL_MaxLook, d1.SLL_MaxLook))

这为我提供了4条规则,其中大部分时间都花在了这些规则上,在这种情况下,这些规则足以看出需要更改的内容(通过知道在哪里查找问题)。

如果您是IntelliJ用户,您可能希望使用antlr插件:。它有一个内置的探查器。我将再次尝试这个插件,因为模糊和lookaheads的可视化看起来非常有趣。但是我上次在这个特定的语法中遇到了问题,词法分析器与语法分析器完全分离。嗯,我以前使用过带有独立词法分析器和语法分析器的插件,我没有注意到任何问题。希望它对你有用!