我已经看到一些声称优化的PEG解析器通常不会比优化的LALR(1)或LL(k)解析器更快。 (当然,解析的性能取决于特定的语法。)
我想知道PEG解析器是否存在任何特定限制,无论是一般有效还是某些PEG语法子集会使它们不如LALR(1)或 LL(k)表现明智。
特别是,我对解析器生成器感兴趣,但假设在任何特定情况下都可以调整它们的输出以提高性能。我还假设解析器已经过优化,如果需要提高性能,可以稍微调整一下特定的语法。
答案 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
解析器(以及LL
,LR
的关联解析器)并不是必需的,但提供了解析的理论界限,因此可以进行比较。
但请注意,无限前瞻可用于在线性时间内解析语法/语言(例如,通过packrat
或antlr
),这些语法无法通过LL(k)
或{{1即使在非线性时间内,重要的是要理解与相比的内容。