Scala Parser:但它既不包含在定界符列表中,也不包含在词法的保留关键字列表中

Scala Parser: but it is neither contained in the delimiters list, nor in the reserved keyword list of lexical

我已经使用解析器组合器编写了一个 Scala 解析器:

  case class KW(str: String) {

    val parser: Parser[String] = str
  }

  implicit class SymbolView(symbol: Symbol) {

    val $: KW = {
      KW(symbol.name.toLowerCase())
    }
  }

  implicit def ks2Parser(ks: KW): Parser[String] = ks.parser

  val _DELETE = 'delete $
  val _REMOVE = 'remove $
  val _DROP = 'drop $
  val DELETE = _DELETE | _REMOVE | _DROP

  lexical.reserved ++= Seq("delete", "remove", "drop")

  val scanner: lexical.Scanner = new lexical.Scanner("delete")

  phrase(DELETE).apply(scanner)

但是 scala 解析器给我这个错误:

failure: You are trying to parse "drop", but it is neither contained in the delimiters list, nor in the reserved keyword list of your lexical object

我非常确定 "delete" 和 "drop" 都包含在词法的保留关键字列表中(我在调试模式下发现了它们)。所以这个错误信息显然是错误的。它是 Scala 解析器组合器中的错误吗?我应该怎么做才能解决它?

当您使用 $ 时,StandardTokenParsers.keyword 最终会在行 val parser: Parser[String] = str 中隐式调用。它在调用时使用 lexical.reserved 的内容。这些调用发生在您创建 _DELETE/_REMOVE/_DROP 解析器时,这是在您将标记添加到 lexical.reserved.

之前

因此要么移动行以在创建解析器之前添加保留标记:

lexical.reserved ++= Seq("delete", "remove", "drop")

val _DELETE = 'delete $
val _REMOVE = 'remove $
val _DROP = 'drop $
val DELETE = _DELETE | _REMOVE | _DROP

或者使解析器定义 defs(或 lazy vals)而不是 vals:

def _DELETE = 'delete $
def _REMOVE = 'remove $
def _DROP = 'drop $
def DELETE = _DELETE | _REMOVE | _DROP