我正在为ECMAScript 6编写语法。语法分为两个文件:lexer grammar和parser grammar。
生成的解析器工作正常,但性能非常糟糕。它在循环中的第一次解析和下一次解析之间有很大的不同。例如,使用prototype.js文件的LL预测模式(~2 500行)的第一次解析当前需要大约8-12秒,并且下一次解析在我的机器上需要大约890-990ms。在进行一些语法优化之前,第一次解析需要大约58秒,第二次解析需要7秒。当我尝试SLL解析器时,建议获得更好的性能,那么即使在30分钟后第一次解析也没有完成,所以解析可能处于无休止的循环中。在这种情况下,我想得到约400毫秒的时间。
当解析esvalidate.js文件时,其中200行比第一次LL解析通常需要1.6 - 1.9秒,第二次LL解析需要大约260ms。当解析器切换到预测模式SLL时,第一次解析大约完成16秒(比LL预测模式多十倍),但第二次解析只需70ms。
我们可以以某种方式加速第一次解析吗? 为什么第一次SLL解析需要花费这么多时间?甚至在prototype.js的情况下30分钟后还没完成?任何建议,这将有助于我解决这个问题,这是值得欢迎的。
我使用antlr 4.5.1。用于生成和运行解析器。
感谢您的每一个提示。