【问题标题】:Scala parser combinator reduce/foldLeftScala 解析器组合器 reduce/foldLeft
【发布时间】:2013-01-19 00:04:20
【问题描述】:

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

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

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

我认为这样的事情可能会奏效:

primitives2.reduce(_|_)

但是不行。然后我找到了这个 sn-p,它可以工作:

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

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

【问题讨论】:

    标签: scala parser-combinators


    【解决方案1】:

    我将假设您正在使用 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 方法提供您自己的起始值。

    【讨论】:

      猜你喜欢
      • 2020-01-17
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2012-10-04
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多