我有这个解析器:
import scala.util.parsing.combinator.JavaTokenParsers
class RequestMappingParser extends JavaTokenParsers {
def requestMapping: Parser[Any] = "@RequestMapping(" ~ commaDelimitedSeq ~ ")"
def commaDelimitedSeq: Parser[Any] = repsep(keyValue, ",")
def keyValue: Parser[Any] = key ~ "=" ~ value
def key: Parser[Any] = "value" | "method"
def value: Parser[Any] = """[^)]*""".r
}
我有这个简单的课程:
class MethodRequestMapping(val value: String, val method: String)
我的解析器可以解析此字符串:
"@RequestMapping(value = \"/ex/foos\", method = RequestMethod.GET)"
并返回Parser[Any]
的结果。我希望它返回Parser[MethodRequestMapping]
的结果。
我该如何做?我知道我必须做这样的事情:
def requestMapping: Parser[MethodRequestMapping] = "@RequestMapping(" ~ commaDelimitedSeq ~ ")" ^^ {
// Some sort of pattern matching and creation of MethodRequestMapping
// ???
}
但是到底发生了什么????还是最好以完全不同的方式来做?
首先,您使用的组合词的一半被创建为Parser[String]
,并且是您的类型注释将它们组合成Parser[Any]
(由于协方差而被允许,但在这种情况下也完全没有用)。