Parsing Packrat解析与LALR解析

Parsing Packrat解析与LALR解析,parsing,parser-generator,lalr,Parsing,Parser Generator,Lalr,很多网站都声明packrat解析器可以在线性时间内解析输入。 因此,乍一看,它们比yacc或bison工具构建的LALR解析器要快 我想知道当使用公共输入(如编程语言源文件)而不是任何理论输入进行测试时,packrat解析器的性能是否比LALR解析器的性能好/差 有人能解释这两种方法之间的主要区别吗。 谢谢 我不是packrat解析方面的专家,但您可以在上了解更多 我还没有深入研究它,所以我假设packrat解析的线性时间特征是正确的 L(AL)R解析器也是线性时间解析器。所以在理论上,无论是p

很多网站都声明packrat解析器可以在线性时间内解析输入。
因此,乍一看,它们比yacc或bison工具构建的LALR解析器要快

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

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

谢谢

我不是packrat解析方面的专家,但您可以在上了解更多

我还没有深入研究它,所以我假设packrat解析的线性时间特征是正确的

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

当然,在实践中,重要的是实施。L(AL)R状态转换可以在很少的机器指令中执行(“在向量中查找令牌代码,获取下一个状态和操作”),因此它们在实践中可以非常快。通过将L(AL)R解析“编译”为机器代码,您可以得到闪电般快速的解析器,如所示。(机器现在比他写论文时快了20年!)

如果packrat解析器在运行时存储/缓存结果,它们可能是线性时间,但我猜恒定开销会相当高,那么L(AL)R解析器在实践中会快得多。据我所知,YACC和Bison的实现非常好

如果你关心答案,仔细阅读基本的技术论文;如果您真的关心,那么实现其中一个并检查开销常量。我的钱主要在L(AL)R上

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


(我曾经构建过LALR解析器生成器和相应的解析器。我不再这样做了;相反,我使用的是线性时间,但可以处理任意上下文无关的语法。我放弃了一些性能,但我可以[并且确实,请参见bio]为多种语言构建几十个解析器,而不会遇到很多麻烦。)。

我是LRSTAR的作者,一个开源的LR(k)解析器生成器。因为人们对它很感兴趣,我把这个产品放回了网上

多年来,我一直在研究LALR解析器和DFA lexer的速度。Tom Pennello的论文非常有趣,但与其说是编译器的现实解决方案,不如说是一个学术练习。但是,如果您只需要一个模式识别器,那么它可能是最适合您的解决方案

问题在于,现实世界的编译器通常需要做的不仅仅是模式识别,例如查找传入符号的符号表、错误恢复、提供预期列表(语句完成信息)以及在解析时构建抽象语法树

1989年,我将LRSTAR解析器的解析速度与“yacc”进行了比较,发现它们的解析速度是“yacc”解析器的2倍。LRSTAR解析器使用了发表在论文“为便携式编译器优化解析器表”中的思想

对于lexer(词法分析)速度,我在2009年发现“re2c”生成的词法速度最快,大约是“flex”生成的词法速度的两倍。当时我正在重写LRSTAR lexer生成器部分,并找到了一种制作lexer的方法,其速度几乎与“re2c”一样快,而且更小。但是,我更喜欢LRSTAR生成的表驱动lexer,因为它们几乎和LRSTAR生成的lexer一样快,而且代码编译速度更快


顺便说一句,LRSTAR生成的编译器前端可以以每秒2400000行或更快的速度处理源代码。LRSTAR生成的Lexer每秒可以处理30000000个令牌。测试计算机是一台3.5GHz的机器(从2010年开始)

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


没有更多的思考,我无法证明这一点,但我认为没有什么能打败自上而下的下降解析器,在这种解析器中,语义驱动解析器,解析器驱动词法分析器,从性能上看。它也是实现中最通用、最易于维护的实现之一。

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


我知道这是一篇老文章,但大约一个月前,我偶然发现了这篇文章:今天无意中看到了这篇文章


该报淡化了这一点,称:packrat回忆录是喜忧参半。如果你有一些启发法,知道这条或另一条规则匹配的频率,就可以得到最好的结果。从本质上讲,记住具有以下两个属性的规则才有意义:(1)元素很少,(2)非常常见。

可以免费阅读该文档(1986年Tom Pennello关于非常快速LR解析的论文)?当然可以。访问当地大学的计算机科学图书馆:-}我认为ACM只会向您收取少量费用;我认为确保ACM继续提供类似的东西是值得的。@IraBaxter,L(AL)R解析器是否像packrat解析器一样无扫描?LALR扫描仪可能无扫描:只需使用语法规则定义“标记”。如果像典型的LEX/YACC那样使用正则表达式定义令牌,那么除了性能之外,几乎不会损失任何东西。(您可以定义以非特定方式扩展正则表达式的lexer,例如,字符先行),但您不能这样做this@Gunther:您可以看到我已设法让Paul Mann恢复LRStart站点。请更新提供的链接。“编译器软件”正在重定向;“sourceforge”没有源代码,唯一的文件下载失败。我的拙见是LRSTAR非常好。保罗·曼花了数年的时间来纠正这一错误;然后他把它交给了o