【问题标题】:Scala pattern matching multiple combinator parsers resultsScala模式匹配多个组合器解析器结果
【发布时间】:2014-10-24 16:57:13
【问题描述】:
有一个 List[String] 和几个解析器,我想将 List 中的每个 String 模式匹配到解析器。所以它看起来像这样(警告,伪代码):
myStringList.map{
case MyParser.keyword => keyword match {
case KeywordParser.keyword1 => //it's special keyword1
case KeywordParser.keyword2 => //special treatment for keyword2
case NotSpecial => //it's a usual command
}
case MyParser.stringValue => //etc...
}
我为什么要这样做?
我正在解析一个简单的脚本行,其中包含“字符串”和 $(keywords)。有些关键字比较特殊,需要单独处理。
目前我只有一个特殊关键字,所以我使用链式 parseAll 和 match,但感觉不对。
那么,如何实现呢?
【问题讨论】:
标签:
scala
parsing
functional-programming
pattern-matching
【解决方案1】:
它不是真的受支持,但你可以这样做:
val parseKeyword: PartialFunction[String, ... ] {
case KeywordParser.keyword1 => //it's special keyword1
case KeywordParser.keyword2 => //special treatment for keyword2
case NotSpecial => //it's a usual command
}
myStringList.map{
case x@MyParser.keyword if parseKeyword.isDefinedAt(x) => parseKeyword(x)
case MyParser.stringValue => //etc...
}
【解决方案2】:
我打赌我的大脑短路了,因为我第二天早上醒来并意识到,我所需要的只是几个解析器、一些案例类和一对模式匹配器。所以我的问题的解决方案是这样的(伪代码):
case class SpecialKeyword1(value: String)
case class SpecialKeyword2(value: String)
...
case class SpecialKeywordN(value: String)
case class SimpleKeyword(value: String)
object MyParser extends JavaTokenParsers{
def expression: Parser[Any] = ...
def keyword1: Parser[SpecialKeyword1] = ...
def keyword2: ...
...
def simplekeyword: Parser[SimpleKeyword] = ...
}
object Main {
def parseScript(inputScript: String): String = {
MyParser.parseAll(MyParser.expression, inputScript) match {
case Success(result, _) => {
case SpecialKeyword1(val) => ...
case SpecialKeyword2(val) => ...
...
case SimpleKeyword(val) => ...
case str: String => ...
}
case Failure(_, _) => "Parsing Failure"
case Error(_, _) => "Parsing Error"
}
}
}