如何覆盖基于RegexParsers的解析器组合器的分隔符

时间:2015-10-30 04:14:48

标签: scala parsing parser-combinators

我们的解析器需要以下两个功能:

  • 正则表达式解析功能。
  • 展开被视为分隔符的字符集。

窘境是,前者需要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。

目前尚不清楚如何同时获得这两种功能。

这些之间的一个区别可能会影响这种方法:

  • StandardTokenParsers是基于字符的,而RegexParsers是基于字符串的

但即便如此 - RegexParsers使用了一些分隔符集:他们需要定义如何应用代字号运算符

E.g。 val myParser = someRegexParser~someOtherRegexParser

因此,代字号使用一组预定义的分隔符来区分模式的开头。但那套在哪里?以及如何改变它?任何指导意见。

0 个答案:

没有答案