Parsing Packrat解析器冲突

Parsing Packrat解析器冲突,parsing,scala,grammar,context-free-grammar,shift-reduce-conflict,Parsing,Scala,Grammar,Context Free Grammar,Shift Reduce Conflict,假设我尝试使用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解析器支持的左递归,但我不理解它为什么失败。根据解析器文档,如果P成功,P | Q等于P,因此在这种情

假设我尝试使用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解析器支持的左递归,但我不理解它为什么失败。根据解析器文档,如果P成功,P | Q等于P,因此在这种情况下,
ab
应替换为“ab”,而不是“a”,就像我将
ab
替换为:

  lazy val ab: PackratParser[AnyRef] = ab ~ "b" | "a"

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

这就是你们在这里所拥有的:abc呼叫ab,ab可以呼叫abc

也许你应该试着把|放在abc规则中以避免循环