【发布时间】:2014-07-28 02:35:00
【问题描述】:
以下 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"))
}
我收到错误消息:
[1.3] failure: end of input expected
2 < 4
^
但是,如果我将“表达式”的定义更改为
lazy val expression: PackratParser[Any] = (
numericLit ~ "<" ~ numericLit
| numericLit
)
问题消失了。
问题似乎在于,对于“表达式”的原始定义代码,应用了仅包含“numericLit”的第一条规则,因此解析器确实希望输入在之后立即结束。我不明白为什么解析器一注意到输入确实没有结束就不会回溯; scala PackratParsers 应该是回溯,我还确保按照另一个问题的答案中的建议将“def”替换为“lazy val”。
【问题讨论】:
标签: scala backtracking parser-combinators