快速的答案是使用
trait
而不是将解析器托管在
object
import scala.util.parsing.combinator._
trait BinaryParser extends JavaTokenParsers {
def anyrep: Parser[Any] = rep(any)
def any: Parser[Any] = zero | one
def zero: Parser[Any] = "0"
def one: Parser[Any] = "1"
}
trait LongChainParser extends BinaryParser {
def parser1: Parser[Any] = zero~zero~one~one
}
trait ShortChainParser extends BinaryParser {
def parser2: Parser[Any] = zero~zero
}
object ExampleParser extends LongChainParser with ShortChainParser {
def parser: Parser[Any] = (parser1 ||| parser2) ~ anyrep
def main(args: Array[String]) {
println(parseAll(parser, args(0) ))
}
}
因为组合运算符喜欢
~
和
|
是针对内部类编写的,通过说
BinaryParser#Parser[_]
对你没有好处。使用特性可以解决所有的内部类问题,因为两者都有
Parser[Any]
从
LongChainParser
和
ShortChainParser
现在指的是
ExampleParser
对象。