Scala解析器组合器reduce / foldLeft

时间:2013-01-19 00:04:21

标签: scala parser-combinators

我正在尝试从动态填充的列表中进行以下操作:

val primitives = "x" | "y" | "z" // what I want

val primitives2 = List("x", "y", "z") // what I need to transform from

我认为这样的事情可能有用:

primitives2.reduce(_|_)

但是没有去。然后我找到了这个片段,它起作用了:

primitives2.foldRight(failure("no matching delimiter"): Parser[Any])(_|_)

但是,基本案例failure("no matching delimiter")令人困惑。这只是Parser对象的等效Nil情况吗?

1 个答案:

答案 0 :(得分:4)

我将假设您正在与RegexParsers或其后代之一合作。如果是这样,那么问题只是从StringParser[String]的隐式转换不会自动启用reduce(_ | _)。如果您先显式转换列表中的每个项目,请执行以下操作:

val anyPrimitive = primitives2.map(literal).reduce(_ | _)

你会完全没问题 - 除了这会让你留下一些有点混乱的错误信息,比如:

scala> parser.parseAll(parser.anyPrimitive, "a")
res8: parser.ParseResult[Any] = 
[1.1] failure: `z' expected but `a' found

a
^

如果您想要更清晰的错误消息,那么您需要使用fold方法提供自己的起始值。