Packrat解析器冲突

时间:2011-02-12 17:28:03

标签: parsing scala grammar context-free-grammar shift-reduce-conflict

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

1 个答案:

答案 0 :(得分:1)

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

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

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