gpt4 book ai didi

scala - 如何对 Scala 的解析器组合器结果进行模式匹配

转载 作者:行者123 更新时间:2023-12-04 16:27:58 25 4
gpt4 key购买 nike

我们有一个解析输入字符串的多线程 RPC 服务器。我们遇到了一个问题,即 Scala 的解析器组合器库不是多线程安全的:Parsers.scala 中的 var lastNoSuccess|被任何解析使用。我们在这一行得到一个 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

最佳答案

用这个:

val parser = new SqlParserImpl
parser.parseAll(parser.term, "term") match {
case parser.Success(result, _) => true
case parser.NoSuccess(_, _) => false
}
#符号用于指定类型成员。在您的情况下,它使用构造函数或提取器模式,需要引用对象或看起来像构造函数的东西。

唔。我手边没有 2.7。尝试这个:
parser.parseAll(parser.term, "term") match {
case parser.Success(result, _) => true
case parser.Failure(_, _) => false
case parser.Error(_, _) => false
}

关于scala - 如何对 Scala 的解析器组合器结果进行模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5906433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com