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

Parsing 解析器性能:PEG与LALR(1)或LL(k),parsing,parser-generator,lalr,ll,peg,Parsing,Parser Generator,Lalr,Ll,Peg,我已经看到一些声称,优化的PEG解析器通常不能比优化的LALR(1)或LL(k)解析器更快。(当然,解析的性能取决于特定的语法。) 我想知道PEG语法分析器是否有任何特定的限制,无论是在一般情况下有效,还是对于PEG语法的某些子集有效,都会使它们低于LALR(1)或 LL(k)性能方面 特别是,我对解析器生成器感兴趣,但假设它们的输出可以在任何特定情况下进行性能调整。我还假设解析器经过优化,如果需要改进性能,可以稍微调整特定语法。找到了一个好方法。其中的一些引语: L(AL)R解析器也是线性时间

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

我想知道PEG语法分析器是否有任何特定的限制,无论是在一般情况下有效,还是对于PEG语法的某些子集有效,都会使它们低于LALR(1)或 LL(k)性能方面

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

找到了一个好方法。其中的一些引语:

L(AL)R解析器也是线性时间解析器。所以在理论上,无论是packrat还是L(AL)R解析器都不是“更快的”

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

观察结果:大多数语言前端不会花费大部分时间进行“解析”;相反,他们花了很多时间在词汇分析上。优化…,解析器的速度就不会有多大影响了


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

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

packrat
解析器(以及
LL
LR
的相关解析器)不一定实用,但提供了解析的理论界限,因此可以进行比较


但请注意,可以使用无限前瞻来在线性时间内解析语法/语言(例如,通过
packrat
antlr
),这是通过
LL(k)
LR(k)无法解析的
即使是在非线性时间,理解与之相比的内容也很重要。注意:内存消耗超出了这个问题的范围(我假设我们有足够的内存用于解析)。澄清:问题不限于Packrat解析器。PEG的其他解析器也可能会讨论。