谁更快:PEG还是GLR?

时间:2012-08-01 11:51:08

标签: javascript performance parser-generator peg glr

我正在尝试为C/AL programming language创建某种lint工具。所以基本上我需要对源代码执行语法和词法分析。我打算从头开始编写解析器,但后来发现有很多工具可以帮助自动生成这些解析器。

我需要性能,因为在一个部分中检查20兆字节的代码是正常情况,我需要该工具可以通过自定义规则进行扩展。所以我决定使用JavaScript。

到目前为止,我发现了两个可以使用JisonPEG.js的生成器。

其中哪一个给我更多解析性能?也许不是比较库,而是算法?

哪一个更适合我的需求(解析通用编程语言)?

更新 我找到了类似的Q& As:

3 个答案:

答案 0 :(得分:7)

一般来说,你可以从一个shift-reduce解析器中获得非常好的解析性能,比如Jison实现的解析器。这可能是一个老派,但它可以在非常严格的内存要求和线性时间内工作。

PEG生成一种可能更强大的不同类型的解析器,但需要更多内存才能产生相同的结果。即PEG将需要与输入成比例的内存量,而LALR解析器将在更少的空间(一些表和一个小堆栈)中执行它。

答案 1 :(得分:5)

"我需要性能(20Mb)......所以我决定使用Javascript"。这些都是矛盾的。

精心编码的递归下降解析器可能非常快,但您必须编写大量代码。通常,LALR(1)解析器(由Bison从语法等生成)非常快,并且非常容易编码。 (有 技术论文展示了如何将LALR解析器直接编译为机器代码;这些解析器非常快,但你需要实现很多自定义机制来构建一个。)

如果你想要轻松解决高性能解析,你应该考虑LRStar。 (我知道并高度尊重作者,但在其他方面没有任何关系)。这产生了 非常快的LALR解析器。缺点:你必须使你的语法LALR兼容。 你必须扩展你的规则"和你一样 扩展任何其他C程序:通过编写C代码。这看起来并没有那么糟糕 比编写JavaScript恕我直言,但规则可能会执行更快 而且你正在考虑的规模很重要。

GLR解析必然比LALR慢,因为它有更多的簿记要做。但这只是一个不变因素。它可以是高的(例如,100倍) 像LRStar这样的性能引擎。这可能是值得的,因为将语法写成形状要容易得多,而语法较少的复杂可能会使编写自定义规则更容易。如果你真的有1个MSLOC文件,这些解析器最好是中等速度。

PEG基本上是回溯。它必须尝试,并在他们不工作时回溯。它们必须比LALR解析器慢至少它们所做的回溯量。你也有语法形成问题。

你会发现,如果你想做的话,解析根本就不够 任何最微弱的东西。在这种情况下,您不希望优化解析; 您希望优化基础架构以进行程序分析。看我的论文 Life After Parsing为另一种选择。

答案 2 :(得分:1)

  

到目前为止,我发现了两台发电机,我可以使用Jison和PEG.js.   哪一个给我更多解析性能?

根据我创建的JavaScript Parser Libraries基准测试 似乎PEG.js更快(至少在Chrome / V8上)。

您可以在线运行: http://sap.github.io/chevrotain/performance/

请注意,此基准测试使用非常简单的JSON语法进行比较 解析库的性能不是更大,更复杂的编程语言语法。