“我需要性能(对于 20Mb)......所以我决定使用 Javascript”。这些都是矛盾的。
仔细编码的递归下降解析器可以非常快,但您必须编写大量代码。通常,LALR(1) 解析器(由 Bison 从语法等生成)非常快,并且非常容易编码。(有技术论文展示了如何将 LALR 解析器直接编译为机器代码;这些解析器速度非常快,但您需要实现许多自定义机器来构建一个)。
如果你想以最少的汗水实现高性能解析,你应该考虑LRStar。(我知道并高度尊重作者,但除此之外与此无关)。这会产生非常快的 LALR 解析器。缺点:你必须让你的语法 LALR 兼容。您必须像扩展任何其他 C 程序一样扩展您的“规则”:通过编写 C 代码。恕我直言,这似乎并不比编写 JavaScript 差多少,但规则可能会执行得更快,并且在您考虑的规模上这很重要。
GLR 解析必然比 LALR 慢,因为它需要做更多的簿记工作。但这只是一个不变的因素。与 LRStar 这样的高性能引擎相比,它可能是显着的(例如,100 倍)。这可能是值得的麻烦,因为它更容易塑造你的语法,而且不那么复杂的语法可能会使编写自定义规则更容易。如果你真的有数百万行代码,这些解析器充其量只能是中等速度。
PEG基本上是一种回溯。它必须尝试一些事情,并在它们不起作用时回溯。它们必须比 LALR 解析器慢,至少要慢于它们所做的回溯量。你还有语法塑造问题。
但是,您会发现,如果您想做任何最微不足道的事情,仅仅解析是不够的。在这种情况下,您不想优化解析;您想优化基础设施以进行程序分析。请参阅我关于
解析后的生活的文章以获取另一种选择。