scala - 枚举值的解析器组合器

标签 scala parser-combinators

是否有更清晰的方法将字符串映射到解析器组合器中的枚举值?

object Mode extends Enumeration {
  type Mode = Value
  val View, Add, Modify, Delete  = Value
}

import Mode._

object ModeParser extends JavaTokenParsers {
  def mode: Parser[Mode] = ("^(" + Mode.values.mkString("|") + ")$").r ^^ { 
    Mode.withName(_) 
  }
}

最佳答案

解析器是可组合的,因此一旦您可以构建读取一个 Mode.Value 的解析器,您就可以使用 | 组合所有此类变体:

object ModeParser extends JavaTokenParsers {
  val mode: Parser[Mode.Value] = Mode.values.toList map{m =>
    literal(m.toString) ^^^ m
  } reduceLeft {_ | _}
}

你会像这样使用它:

scala> ModeParser.parseAll(ModeParser.mode, "Viewx")

关于scala - 枚举值的解析器组合器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416835/

相关文章:

scala - REST Lift 项目中的 SSL,从哪里开始?

scala - 如何使方法返回与输入相同的泛型?

用于模式匹配的 Scala 类型删除

scala - 如何使用解析器组合器进行条件检查

scala - 解析器测试的意外结果

scala - 使用 Spark Scala 从 String 到 Array[Structype] 的模式转换

java - 如何在java中构造scala.collection.immutable.List对象

scala - 如何使用 Scala 解析器组合器处理不区分大小写的关键字

Scala 解析器组合器几乎是最后一个

parsing - Haskell——解析器组合器关键字