Scala Parsers:可用性,差异和组合?

时间:2010-12-12 19:24:21

标签: parsing scala parser-generator parser-combinators

我的问题是关于Scala Parsers:

  • 哪些可用(在标准库和外部),
  • 他们之间的区别是什么,
  • 他们是否共享通用API和
  • 可以组合不同的Parsers来解析一个输入字符串吗?

我至少找到了这些:

4 个答案:

答案 0 :(得分:12)

还有Dan Spiewak对GLL parser combinators的实现。

答案 1 :(得分:11)

值得注意的是,Scala的标准解析器组合器不是LL,也不是Packrat组合器LALR。解析器组合器是一种具有无限回溯的递归下降形式。你可以把它们想象成“LL(*)”。这种技术支持的语言类恰好是明确的无上下文语言类,或者与LALR(1)和Packrat相同的类。但是,语法的类别有点不同,最显着的弱点是不支持左递归。

Packrat组合器支持左递归,但它们仍然无法支持LALR的许多其他更微妙的功能。这种弱点通常源于有序选择运算符,这可能导致一些非常棘手的语法错误,以及阻止某些良好的语法配方。最常见的这些错误的例子发生在你不小心将最不明确的选择排序为最短时,导致贪婪的匹配阻止正确的分支被尝试。 LALR没有这个问题,因为它只是一次尝试所有可能的分支,将决策点推迟到生产结束。

答案 2 :(得分:8)

还有一种称为“使用衍生物进行解析”的新方法。该方法描述为here。 Daniel Spiewak有一个implementation in Scala

答案 3 :(得分:4)

只是想用指向parboiled项目的最新版本的指针更新这个答案,名为parboiled2:

https://github.com/sirthias/parboiled2

parboiled2仅针对Scala(与Scala + Java相对),使用Scala宏,并且非常积极地维护。