2013-01-19 101 views
2

我想提出以下,從一個動態填充列表:Scala的解析器組合減少/ foldLeft

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")是混亂的。這只是解析器對象的等價Nil情況嗎?

回答

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方法提供您自己的起始值。

相關問題