Scala PackratPassers:回溯似乎不起作用
以下scala代码无法按预期工作: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
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
)