2

想我嘗試解析字符串ABC有Packrat分析器:Packrat解析器衝突

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 | Q等於P如果P成功,所以在這種情況下ab應與「AB」所取代,而不是「一個」,因爲它確實如果我更換ab

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

回答

1

一個Packrat解析器支持左遞歸,但確實它支持規則之間的循環(沒有進展)。

這就是你在這裏:abc調用ab可以調用abc。

也許你應該嘗試把|在abc規則中避免循環。