如何在Scala的解析器组合结果上进行模式匹配

Bla*_*jac 5 scala parser-combinators

我们有一个多线程RPC服务器来解析输入字符串.我们碰到的地方Scala的解析器组合库不是多线程安全的问题:在var lastNoSuccess Parsers.scala用于任何解析.我们在这一行中得到一个NullPointerException

if (!(lastNoSuccess != null && next.pos < lastNoSuccess.next.pos))
Run Code Online (Sandbox Code Playgroud)

通过创建扩展其中一个解析器的对象来实现解析器的默认方式,但是我想按需构造解析器,因此每个解析器都有自己的内部状态,因此我使用的是类而不是对象.但是,由于我需要对结果进行模式匹配,因此我无法编译它:

import scala.util.parsing.combinator.RegexParsers

class SqlParserImpl
  extends RegexParsers
{
  val term: Parser[String] = """(?i)term\b""".r
}

object Test
{
  def main(args: Array[String]): Unit =
  {
    val parser = new SqlParserImpl
    parser.parseAll(parser.term, "term") match {
      // How do I match?
      case SqlParserImpl#Success(result, _) => true
      case SqlParserImpl#NoSuccess => false
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

失败了

t.scala:16: error: '=>' expected but '#' found.
          case SqlParserImpl#Success(result, _) => true
                            ^
t.scala:17: error: '=>' expected but '#' found.
          case SqlParserImpl#NoSuccess => false
                            ^
two errors found
Run Code Online (Sandbox Code Playgroud)

huy*_*hjl 11

用这个:

val parser = new SqlParserImpl
parser.parseAll(parser.term, "term") match {
  case parser.Success(result, _) => true
  case parser.NoSuccess(_, _) => false
}
Run Code Online (Sandbox Code Playgroud)

该#符号用于指定类型成员.在您的情况下,它使用构造函数或提取器模式,需要引用一个对象或看起来像构造函数的东西.

嗯.我没有2.7便利.试试这个:

parser.parseAll(parser.term, "term") match {
  case parser.Success(result, _) => true
  case parser.Failure(_, _) => false
  case parser.Error(_, _) => false
}
Run Code Online (Sandbox Code Playgroud)