首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parsec vs Yacc/Bison/Antlr:为什么以及何时使用Parsec?

Parsec vs Yacc/Bison/Antlr:为什么以及何时使用Parsec?
EN

Stack Overflow用户
提问于 2011-02-20 13:11:35
回答 3查看 10.9K关注 0票数 41

我是Haskell和Parsec的新手。在阅读Chapter 16 Using Parsec of Real World Haskell之后,一个问题出现在我的脑海中:为什么以及何时Parsec优于其他解析器生成器,如Yacc/Bison/Antlr?

我的理解是,Parsec创建了一个编写解析器的很好的DSL,而Haskell让它变得非常容易和富有表现力。但解析是这样一种标准/流行的技术,它值得拥有自己的语言,可以输出到多种目标语言。那么,我们什么时候应该使用Parsec来代替,比如说,从Bison/Antlr生成Haskell代码?

这个问题可能会超出技术的范畴,进入行业实践的领域。在从头开始编写解析器时,与Bison/Antlr或类似的解析器相比,选择Haskell/Parsec有什么好处?

顺便说一句:我的问题和this one很相似,但是没有得到令人满意的回答。

EN

回答 3

Stack Overflow用户

发布于 2011-02-20 22:03:55

您列出的工具之间的主要区别之一是,ANTLR、Bison和它们的朋友是解析器生成器,而Parsec是解析器组合器库。

解析器生成器读入语法的描述并输出解析器。通常不可能将现有语法组合成新的语法,并且肯定不可能将两个现有的生成的解析器组合成新的解析器。

解析器组合器OTOH除了将现有解析器组合成新的解析器外,什么也不做。通常,解析器组合器库附带两个简单的内置解析器,它们可以解析空字符串或单个字符,并且它附带一组组合符,这些组合符接受一个或多个解析器,并返回一个新的解析器,例如,解析原始解析器的序列(例如,您可以组合d解析器和o解析器以形成do解析器),原始解析器的交替(例如0解析器和1解析器到0|1解析器),或者多次解析原始解析器(重现)。

这意味着,例如,您可以使用现有的Java解析器和HTML解析器,并将它们组合成JSP的解析器。

大多数解析器生成器都不支持它,或者只以有限的方式支持它。解析器组合子OTOH只支持这个,不支持其他。

票数 55
EN

Stack Overflow用户

发布于 2011-02-20 17:18:03

您可能希望查看此问题以及您的问题中的链接问题。

Which Haskell parsing technology is most pleasant to use, and why?

在Haskell中,竞争是在Parsec (和其他解析器组合器)和解析器生成器Happy之间。如果我已经有了LR语法,我会选择Happy -解析器组合子接受LL形式的语法,从LR到LL的转换需要一些努力,组合解析器通常会显着变慢。如果我没有语法,我会使用Parsec,它比Happy更灵活(强大),在Haskell中工作比用Happy和Alex生成代码更有趣。如果您使用Happy进行解析,那么几乎总是需要使用Alex进行词法分析。

对于行业实践来说,决定使用Haskell只是为了获得Parsec是很奇怪的。对于语法分析,目前的大多数语言都至少有一个语法分析器生成器,可能还有一些更灵活的东西,比如Parsec端口或PEG系统。

Ira Baxter对这个相关问题的回答恰到好处地说明了一个解析器只会让你到达喜马拉雅山脉的立足点来编写一个翻译器,但是作为一个翻译器的一部分仅仅是解析器的一个用途,所以仍然有很多领域相当简约的系统,比如ANTLR,Happy和Parsec都是令人满意的。

票数 9
EN

Stack Overflow用户

发布于 2011-02-20 18:12:03

根据stephen的回答,如果你想坚持使用解析器组合子,我认为最常见的Parsec替代方案之一是attoparsec。主要的区别在于,attoparsec在编写时更偏向于速度,并做出了相应的权衡。例如,如果解析失败,Parsec会做一些记账工作,试图返回有用的错误消息,而attoparsec不会在同样的程度上做到这一点。另外,我认为attoparsec专门针对一种输入流/令牌类型,而Parsec则从输入类型中抽象出来,这样它就可以毫无问题地解析String、ByteString、Text等类型的流。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5055370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档