解析器的性能:PEG与LALR(1)或LL(k)

时间:2012-07-07 08:54:25

标签: parsing parser-generator lalr ll peg

我已经看到一些声称优化的PEG解析器通常不会比优化的LALR(1)或LL(k)解析器更快。 (当然,解析的性能取决于特定的语法。)

我想知道PEG解析器是否存在任何特定限制,无论是一般有效还是某些PEG语法子集会使它们不如LALR(1)或 LL(k)表现明智。

特别是,我对解析器生成器感兴趣,但假设在任何特定情况下都可以调整它们的输出以提高性能。我还假设解析器已经过优化,如果需要提高性能,可以稍微调整一下特定的语法。

2 个答案:

答案 0 :(得分:11)

找到一个好answer about Packrat vs LALR parsing。引自它的一些话:

  

L(AL)R解析器也是线性时间解析器。因此从理论上讲,packrat和L(AL)R解析器都不是“更快”。

     

重要的是,实际上,当然是实施。 L(AL)R状态转换可以在很少的机器指令中执行(“在向量中查找令牌代码,获得下一个状态和动作”),因此它们在实践中可以非常快。

     

观察:大多数语言前端不会花费大部分时间“解析”;相反,他们花了很多时间进行词汇分析。优化...,解析器速度无关紧要。

答案 1 :(得分:5)

PEG解析器可以使用无限前瞻(平均保持线性解析时间,通过packrat),与使用有限前瞻的(默认)LL(k)LR(k)解析器不同,同时保持线性解析时间。

最近(2014-2015)ANTLR4扩展了处理任意前瞻(如PEG),同时保持平均线性解析时间(据说比packrat算法效率更高),但这包含LR解析算法的新扩展和变体(而不是默认的LR算法)。

packrat解析器(以及LLLR的关联解析器)并不是必需的,但提供了解析的理论界限,因此可以进行比较。

但请注意,无限前瞻可用于在线性时间内解析语法/语言(例如,通过packratantlr),这些语法无法通过LL(k)或{{1即使在非线性时间内,重要的是要理解相比的内容。