2

假设我尝试使用 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"
4

1 回答 1

1

Packrat 解析器支持左递归,但它是否支持规则之间的循环(没有进度)。

这就是你在这里所拥有的:abc 调用 ab,ab 可以调用 abc。

也许你应该尝试把 | 在 abc 规则中避免循环。

于 2011-03-28T08:28:00.877 回答