假设我尝试使用Packrat Parser解析字符串 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"
答案 0 :(得分:1)
Packrat解析器支持左递归,但是它支持规则之间的循环(没有进展)。
这就是你在这里所拥有的:abc调用可以调用abc的ab。
也许你应该尝试把|在abc规则中避免循环。