Scala PackratPassers:回溯似乎不起作用

Scala PackratPassers:回溯似乎不起作用,scala,backtracking,parser-combinators,Scala,Backtracking,Parser Combinators,以下scala代码无法按预期工作: import scala.util.parsing.combinator.PackratParsers import scala.util.parsing.combinator.syntactical.StandardTokenParsers import scala.util.parsing.combinator.lexical.StdLexical object Minimal extends StandardTokenParsers with Pack

以下scala代码无法按预期工作:

import scala.util.parsing.combinator.PackratParsers
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
import scala.util.parsing.combinator.lexical.StdLexical

object Minimal extends StandardTokenParsers with PackratParsers {
  override val lexical = new StdLexical

  lexical.delimiters += ("<", "(", ")")

  lazy val expression: PackratParser[Any] = (
  numericLit
  | numericLit ~ "<" ~ numericLit
  )

  def parseAll[T](p: PackratParser[T], in: String): ParseResult[T] =
    phrase(p)(new PackratReader(new lexical.Scanner(in)))

  def main(args: Array[String]) = println(parseAll(expression, "2 < 4"))
}
导入scala.util.parsing.combinator.PackratParsers
导入scala.util.parsing.combinator.Syntactic.StandardTokenParser
导入scala.util.parsing.combinator.lexical.StdLexical
对象极小扩展了带packratParser的StandardTokenParser{
override val lexical=new StdLexical

lexical.delimiters+=(“您看到此行为的原因是交替运算符(垂直条)被设计为接受其第一个成功的替代项。在您的情况下,
numericLit
成功,因此交替从不考虑其他替代项

使用这种语法规范时,如果一个备选方案可以匹配另一个备选方案的前缀,则必须小心。正如您所看到的,较长的备选方案应该放在备选方案中的较早位置,否则它永远不会成功


如果您希望较短的替代项仅在后面没有更多输入时匹配,那么您可以尝试使用
not
组合符来表示该额外条件。但是,如果
expression
用于其他构造中,这种方法将导致问题。

它与packrat解析器无关


您需要知道的是,在中,选择运算符选择第一个匹配项,在您的情况下为
numericLit

还可以使用三栏选择运算符自动选择最长的匹配项,如中所示。
[1.3] failure: end of input expected

2 < 4
  ^
  lazy val expression: PackratParser[Any] = (
    numericLit ~ "<" ~ numericLit
  | numericLit
  )