假设我尝试使用 Packrat 解析器解析字符串abc :
lazy val abc: PackratParser[AnyRef] = ab ~ "c"
lazy val ab: PackratParser[AnyRef] = (ab | abc) ~ "b" | "a"
def parse(in: String) = parseAll(abc, in)
这里我使用了 Packrat 解析器支持的左递归,但我不明白为什么它会失败。根据 Parser 文档 P | 如果 P 成功,Q 等于 P,所以在这种情况下ab
应该用“ab”而不是“a”替换,就像我替换ab
为:
lazy val ab: PackratParser[AnyRef] = ab ~ "b" | "a"