我使用的是ANTLR4 + Python2目标,
time java -jar lib/antlr-4.5-complete.jar -visitor -o build -Dlanguage=Python2 xxx.g4
time ./main.py
生成访问者/词法分析器/解析器文件需要10秒,执行访问者需要4秒。
我该如何调试它的缓慢?
答案 0 :(得分:0)
我写了很多antlr4解析器,我一直都在面对速度问题。我觉得Python目标通常很慢。当解析器非常慢时,它通常会减少/减少问题,这意味着有多个子规则具有相同的终端规则,因此解析器会感到困惑。
当解析器很慢时,我打开跟踪模式并显示跟踪消息。当跟踪消息始终以同一规则延迟时,这是您开始调查的规则。您将查看规则的子规则,看看是否有多个子规则可能成为最高延迟规则。您可能想要注释掉或修改规则,看看是否能使解析器更快。当语法像C ++语法一样大时很难。
作为优化antlr解析器语法的经验法则,一个是消除左递归,另一个是消除具有相同起始规则的子规则。 e.g。
declaration:
declspecifier* what_follows1
| declspecifier* what_follows2
| declspecifier* what_follows3
根据经验,我发现这种语法规则会使解析器变慢。一次更改一下并检查速度是否发生变化,并确保减少步骤不被破坏。
我希望这一切都有道理。