问题 Packrat解析与LALR解析


很多网站都说packrat解析器可以在线性时间内解析输入。
因此,初看起来他们比由工具yacc或bison构建的LALR解析器更快。

我想知道当使用公共输入(如编程语言源文件)而不是任何理论输入进行测试时,packrat解析器的性能是否比LALR解析器的性能更好/更差。

有没有人能解释这两种方法之间的主要区别。
谢谢!


2656
2017-09-07 17:51


起源



答案:


我不是packrat解析的专家,但你可以在这里了解更多 在维基百科上解析表达式语法

我还没有挖掘它,所以我假设packrat解析的线性时间表征是正确的。

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

重要的是,实际上,当然是实施。 L(AL)R状态转换可以在很少的机器指令中执行(“在向量中查找令牌代码,获得下一个状态和动作”),因此它们在实践中可以非常快。通过“编译”L(AL)R解析到机器代码,你可以得到闪电般快速的解析器,如图所示 这是1986年关于非常快速LR解析的Tom Pennello论文。 (机器比现在快20年  写了这篇论文!)。

如果packrat解析器正在存储/缓存结果,它们可能是线性时间,但我猜测常量开销会非常高,然后实际上L(AL)R解析器会更快。我听到的YACC和Bison实现非常好。

如果您关心答案,请仔细阅读基本技术论文;如果你  小心,然后实现其中一个并检查开销常量。我的钱强烈地依赖于L(AL)R。

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

(我曾经构建过LALR解析器生成器和相应的解析器。我不再这样做了;相反,我使用了 GLR解析器 这在实践中是线性时间,但处理任意无上下文的grammmars。我放弃了一些性能,但我可以[并且做,看看bio]为许多语言构建了数十种解析器而没有太多麻烦。)


8
2017-09-27 02:06



可以免费阅读文档(1986 Tom Pennello关于快速LR解析的论文)吗? - raisyn
当然。访问当地大学的计算机科学图书馆: - }我认为ACM只收取适当的费用;恕我直言,确保ACM继续制作这样的东西是值得的。 - Ira Baxter
@IraBaxter,是L(AL)R解析器无解码器的方式是packrat解析器吗? - Mike Samuel
LALR扫描仪可以是无扫描仪的:只需使用语法规则定义“令牌”即可。如果您使用正则表达式定义标记,这是典型的LEX / YACC,那么除了性能之外,您几乎不会丢失任何内容。 (您可以定义以不是例如字符前瞻的方式扩展正则表达式的词法分析器)然后您不能这样做 - Ira Baxter
@Gunther:你可以看到我设法让Paul Mann恢复了LRStart网站。 - Ira Baxter


答案:


我不是packrat解析的专家,但你可以在这里了解更多 在维基百科上解析表达式语法

我还没有挖掘它,所以我假设packrat解析的线性时间表征是正确的。

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

重要的是,实际上,当然是实施。 L(AL)R状态转换可以在很少的机器指令中执行(“在向量中查找令牌代码,获得下一个状态和动作”),因此它们在实践中可以非常快。通过“编译”L(AL)R解析到机器代码,你可以得到闪电般快速的解析器,如图所示 这是1986年关于非常快速LR解析的Tom Pennello论文。 (机器比现在快20年  写了这篇论文!)。

如果packrat解析器正在存储/缓存结果,它们可能是线性时间,但我猜测常量开销会非常高,然后实际上L(AL)R解析器会更快。我听到的YACC和Bison实现非常好。

如果您关心答案,请仔细阅读基本技术论文;如果你  小心,然后实现其中一个并检查开销常量。我的钱强烈地依赖于L(AL)R。

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

(我曾经构建过LALR解析器生成器和相应的解析器。我不再这样做了;相反,我使用了 GLR解析器 这在实践中是线性时间,但处理任意无上下文的grammmars。我放弃了一些性能,但我可以[并且做,看看bio]为许多语言构建了数十种解析器而没有太多麻烦。)


8
2017-09-27 02:06



可以免费阅读文档(1986 Tom Pennello关于快速LR解析的论文)吗? - raisyn
当然。访问当地大学的计算机科学图书馆: - }我认为ACM只收取适当的费用;恕我直言,确保ACM继续制作这样的东西是值得的。 - Ira Baxter
@IraBaxter,是L(AL)R解析器无解码器的方式是packrat解析器吗? - Mike Samuel
LALR扫描仪可以是无扫描仪的:只需使用语法规则定义“令牌”即可。如果您使用正则表达式定义标记,这是典型的LEX / YACC,那么除了性能之外,您几乎不会丢失任何内容。 (您可以定义以不是例如字符前瞻的方式扩展正则表达式的词法分析器)然后您不能这样做 - Ira Baxter
@Gunther:你可以看到我设法让Paul Mann恢复了LRStart网站。 - Ira Baxter


我是LRSTAR的作者,LRSTAR是一个开源的LR(k)解析器生成器。因为人们对它表现出兴趣,所以我把产品重新上线了 LRSTAR.ORG

多年来,我研究过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年开始)。


6
2017-07-13 22:19



请更新提供的链接。 “compilerware”正在重定向; “sourceforge”没有源代码,也没有唯一文件的下载失败。 - Jens A. Koch
我今天修好了链接。 - Paul B Mann
截至今天,它们似乎不再起作用了。 :( - paulotorrens
我很谦虚地认为LRSTAR非常好。保罗曼花了几年时间做对了;然后他按照行业口号“放弃并在服务上赚钱”提供了开源。结果他有效地饿死了;最近与他的谈话表明他已将注意力转向另一个为他提供实际奖励的领域。他最后一次明显的技术行动是删除LRSTAR的所有公共实例。愿我们永远和YACC一起生活。 - Ira Baxter
试试LRSTAR.ORG ...... - Paul B Mann


[2015/02/15]这是1986年关于非常快速LR解析的Tom Pennello论文

http://www.genesishistory.org/content/ProfPapers/VF-LRParsing.pdf


1
2018-02-12 09:45



这里的投票是不值得的。这是一个 大 纸,我很高兴海报提供了一个链接。挫败者实际上试图取消提供链接;那是什么意思?如果他们认为应该把这篇论文的一些概念放在这里,那么阅读论文并撰写这样的总结会更有建设性,而不是抱怨其他人没有这样做。 - Ira Baxter


表演主要是语言设计的问题。对于每种语言,都会有一种最适合的方法,技术或解析器生成器。

我无法在没有更多思考的情况下证明它,但我认为没有什么可以击败自上而下的下降解析器,其中语义驱动解析器,并且解析器在性能方面驱动词法分析器。它也是实现中最通用和易于维护的之一。


0
2017-11-17 15:39



LR解析理论说解析速度相对于输入的长度是线性的。这适用于大多数无上下文的计算机语言。因此解析速度与语言设计没有多大关系。解析速度与解析算法和编写解析器的语言有很大关系。 - Paul B Mann


我知道这是一个旧帖子,但大约一个月前,我偶然发现了这篇论文: https://www.mercurylang.org/documentation/papers/packrat.pdf 并且今天意外地看到了这篇文章。

该文件的淡化版本说:packrat memoisation是一个混合的祝福。如果你有一些启发式方法可以达到最佳结果,那么这个规则或另一个规则的匹配程度。从本质上讲,只记住具有以下两个属性的规则才有意义:(1)少数元素,(2)非常常见。


0
2017-08-14 10:34