У нас есть многопоточный RPC-сервер, который анализирует входные строки.Мы столкнулись с проблемой, при которой библиотека комбинатора синтаксических анализаторов Scala не является многопоточной безопасностью: переменная lastNoSuccess в Parsers.scala используется для любого анализа.Мы получаем NullPointerException в этой строке
if (!(lastNoSuccess != null && next.pos < lastNoSuccess.next.pos))
Способ по умолчанию для реализации синтаксического анализатора путем создания объекта, который расширяет один из анализаторов, но я хочу создать анализатор по требованию, чтобы у каждого было свое внутреннее состояниеЯ использую класс вместо объекта.Тем не менее, я не могу заставить его скомпилировать, так как мне нужно сопоставить шаблон с результатом:
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
}
}
}
Сбой с
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