很多网站都说packrat解析器可以在线性时间内解析输入 所以初看起来他们比由工具yacc或bison构建的LALR解析器更快。
我想知道当使用常见输入(如编程语言源文件)而不是任何理论输入进行测试时,packrat解析器的性能是否比LALR解析器的性能更好/更差。
有没有人可以解释这两种方法之间的主要区别 谢谢!
答案 0 :(得分:9)
我不是packrat解析的专家,但你可以在Parsing expression grammar on Wikipedia了解更多信息。
我还没有挖掘它,所以我假设packrat解析的线性时间表征是正确的。
L(AL)R解析器也是线性时间解析器。因此从理论上讲,packrat和L(AL)R解析器都不是“更快”。
重要的是,实际上,当然是实施。 L(AL)R状态转换可以在很少的机器指令中执行(“在向量中查找令牌代码,获得下一个状态和动作”),因此它们在实践中可以非常快。通过“编译”L(AL)R解析到机器代码,您最终可以使用闪电般快速的解析器,如this 1986 Tom Pennello paper on Very Fast LR parsing所示。 (机器现在比他写论文时快20年!)。
如果packrat解析器正在存储/缓存结果,它们可能是线性时间,但我猜测常量开销会非常高,然后实际上L(AL)R解析器会更快。我听到的YACC和Bison实现非常好。
如果您关心答案,请仔细阅读基本技术论文;如果你真的关心,那么实现其中一个并检查开销常量。我的钱强烈地依赖于L(AL)R。
观察:大多数语言前端不会花费大部分时间“解析”;相反,他们花了很多时间进行词汇分析。优化(你的生物说你是),解析器速度无关紧要。
(我曾经构建过LALR解析器生成器和相应的解析器。我不再这样做了;相反,我使用GLR parsers这是实际的线性时间,但处理任意无上下文的grammmars。我放弃了一些性能,但我可以[并且确实看到bio]为许多语言构建了数十种解析器而没有太多麻烦。)。
答案 1 :(得分:7)
我是LRSTAR的作者,LRSTAR是一个开源LR(k)解析器生成器。由于人们对它表现出兴趣,我已将该产品重新上线LRSTAR。
多年来,我研究过LALR解析器和DFA词法分析器的速度。 Tom Pennello的论文非常有趣,但更多的是学术练习,而不是编译器的真实解决方案。但是,如果您只想要一个模式识别器,那么它可能是您的完美解决方案。
问题在于,真实编译器通常需要做的不仅仅是模式识别,例如对传入符号进行符号表查找,错误恢复,提供期望列表(语句完成信息),以及构建抽象 - 解析时的语法树。
1989年,我将LRSTAR解析器的解析速度与“yacc”进行了比较,发现它们的速度是“yacc”解析器的2倍。 LRSTAR解析器使用文章中发表的想法:“便携式编译器的解析器表的优化”。
对于lexer(词法分析)速度,我在2009年发现“re2c”产生最快的词法分析器,大约是“flex”产生的速度的两倍。那时我正在重写LRSTAR词法分析器生成器部分,并找到了一种方法,使得词法分析器几乎和“re2c”一样快,而且要小得多。但是,我更喜欢LRSTAR生成的表驱动词法分析器,因为它们几乎一样快,代码编译速度更快。
BTW,LRSTAR生成的编译器前端可以以每秒2,400,000行或更快的速度处理源代码。 LRSTAR生成的词法分析器每秒可处理30,000,000个令牌。测试计算机是一台3.5 GHz的机器(从2010年开始)。答案 2 :(得分:1)
[2015/02/15]这是1986年关于非常快速LR解析的Tom Pennello论文
http://www.genesishistory.org/content/ProfPapers/VF-LRParsing.pdf
答案 3 :(得分:0)
表演主要是语言设计问题。对于每种语言,都会有一种最适合的方法,技术或解析器生成器。
我无法在没有更多思考的情况下证明这一点,但我认为没有什么可以击败自上而下的下降解析器,其中语义驱动解析器,解析器驱动词法分析器,性能方面。它也是实现中最通用和易于维护的之一。
答案 4 :(得分:0)
我知道这是一篇旧文章,但是一个月前,我偶然发现了这篇论文:https://www.mercurylang.org/documentation/papers/packrat.pdf,今天不小心看到了这篇文章。
该论文的淡化版本说:packrat记忆是一种喜忧参半的祝福。如果您对此规则或另一条规则匹配的频率有所了解,则会获得最佳结果。从本质上讲,记住具有以下两个属性的规则才有意义:(1)少量元素,(2)非常常见。