我们的解析器需要以下两个功能:
窘境是,前者需要RegexParsers
(或其衍生物,包括JavaTokenParsers
),而后者需要StandardTokenParsers
。
以下代码将添加到StandardTokenParsers
的子类:
// Extend the set of delimiters
class LogLexical extends StdLexical {
delimiters +=(
"|", ",", "<", ">", "/", "(", ")",
";", "%", "{", "}", ":", "[", "]", "&", "^", "~"
)
}
// Use the custom lexer to scan the input text
override val lexical = new LogLexical
override def parse(input: String): Seq[LogLine] = synchronized {
val tokens = new lexical.Scanner(input).asInstanceOf[Reader[Char]]
phrase(allLogTypes)(tokens) match {
case Success(plan, _) => plan
case failureOrError => sys.error(failureOrError.toString)
}
}
但是上述方法不能用于RegexParsers:它们不支持自定义Lexer AFAICT。
目前尚不清楚如何同时获得这两种功能。
这些之间的一个区别可能会影响这种方法:
但即便如此 - RegexParsers使用了一些分隔符集:他们需要定义如何应用代字号〜运算符
E.g。 val myParser = someRegexParser~someOtherRegexParser
因此,代字号使用一组预定义的分隔符来区分模式的开头。但那套在哪里?以及如何改变它?任何指导意见。