谁更快:PEG还是GLR
Who is faster: PEG or GLR?
我正在尝试为C/AL编程语言创建某种lint
工具。因此,基本上我需要对源代码执行语法和词法分析。我曾计划从头开始编写解析器,但后来发现有很多工具可以帮助自动生成这些解析器。
我需要性能,因为在一个片段中检查20兆字节的代码是正常的情况,并且我需要该工具可以通过自定义规则进行扩展。所以我决定使用JavaScript。
到目前为止,我已经找到了两个可以使用Jison和PEG.js的生成器。
它们中的哪一个给了我更高的解析性能?也许不是比较库,而是比较算法?
哪一种更适合我的需求(解析通用编程语言)?
更新:我发现了类似的问答;As:
- Packrat解析与LALR解析
- 解析器的性能:PEG与LALR(1)或LL(k)
"我需要性能(20Mb)。。。所以我决定使用Javascript;。这些都是矛盾的。
精心编码的递归下降语法分析器可能非常快,但您必须编写大量代码。一般来说,LALR(1)解析器(由Bison根据语法等生成)非常快速,并且非常容易编码。(有展示如何将LALR解析器直接编译为机器代码的技术论文;这些解析器速度极快,但您需要实现许多自定义机制来构建一个)。
如果您想用最少的精力进行全面的高性能解析,您应该考虑LRStar。(我了解并高度尊重作者,但除此之外,我与此无关)。这会产生非常快的LALR解析器。缺点:你必须使你的语法LALR兼容。您将不得不延长您的";规则";和你一样扩展任何其他C程序:通过编写C代码。这似乎并不差多少与编写JavaScript IMHO相比,但规则的执行速度可能会快得多在你考虑的范围内,这将很重要。
GLR解析必然比LALR慢,因为它要做更多的记账工作。但这只是一个不变的因素。与LRStar这样的高性能发动机相比,它可能意义重大(例如,100倍)。这可能是值得的,因为它更容易使你的语法成形,而不那么复杂的语法可能会使编写自定义规则变得更容易。如果你真的有数百万行代码,这些解析器最好是中等速度。
PEG基本上是一种回溯。它必须尝试一些事情,当它们不起作用时就反悔。它们必须比LALR解析器慢至少它们的回溯量。你也有语法形成的问题。
不过,您会发现,如果您想进行解析,那么解析根本不够任何稍微有点复杂的东西。在这种情况下,您不希望优化解析;您希望优化程序分析的基础结构。在上查看我的文章分析另一种选择后的生活。
通常,您会从shift-reduce解析器(如Jison实现的解析器)中获得非常好的解析性能。这可能有点老派,但它可以在非常严格的内存要求和线性时间内工作。
PEG产生了一种不同类型的解析器,这种解析器可能更有能力,但需要更多的内存才能产生相同的结果。也就是说,PEG将需要与输入成比例的内存量,而LALR解析器将在更少的空间(一些表和一个小堆栈)中完成这项工作。
到目前为止,我已经找到了两个可以使用Jison和PEG.js的生成器。它们中的哪一个给了我更高的解析性能?
根据我创建的JavaScriptParserLibraries基准PEG.js似乎更快(至少在Chrome/V8上)。
您可以在此处在线运行:http://sap.github.io/chevrotain/performance/
请注意,此基准测试使用非常简单的JSON语法进行比较解析库的性能不是一个更大、更复杂的程序语言语法。
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 我应该使用Ng提交还是点击表格
- 在javascript中确定输入数字是负数还是正数
- 我应该先学习Angularjs还是Laravel
- 我需要NG-IF/NG-SWITCH还是NG-SHOW&NG-HIDE
- 最好使用JavaScript还是XQuery
- 仅当窗口宽度>940像素,无论是通过页面加载还是调整大小
- 内容脚本是在同一个孤立的世界中运行,还是在不同的孤立世界中运行
- 如何检测我的音频流是:正在播放、暂停还是已完成
- 使用appendChild()动态添加的脚本是按顺序执行还是并行执行
- 是重新呈现整个模板更好,还是使用jquery修改一些值更好
- 我应该总是将模块调用到var中,还是在节点中立即执行
- 是我的第三方JavaScript返回html还是只是一个空对象
- 区分客户端运行的是OSX还是Windows
- 最好检查tagName还是HTMLAnchorElement的instance
- 确定滑动事件是左滑动还是右滑动
- 将数据发布到iframe是同步还是异步
- CORS——它是客户端的东西,服务器端的东西,还是传输级别的东西
- 谁更快:PEG还是GLR