我使用Scala的PackratParsers(解析器組合)具有以下形式的左遞歸語法斯卡拉PackratParsers(解析器組合)和左結合
lazy val expr: PackratParser[Expr] = (
...
| expr ~ (":" ~ expr).+ ^^ {
case expr ~ rest => (expr /: rest)(combineBinary)
}
| ...
)
def combineBinary(acc: Expr, next: String ~ Expr) = next match {
case op ~ expr => FunctionCall(op, acc, expr)
}
我想二元運算符「:」來被關聯,使得形式爲x1:x2:...:xn
的表達式將被解析爲(((x1:x2):x3):...:xn)
,即導致形式爲FunctionCall(":", FunctionCall(":", FunctionCall(":", x1, x2), x3), ...)
的AST。
令人驚訝地,與如上面所定義的語法PackratParsers,所得AST仍然是右結合。爲什麼會出現這種情況,並且可以採取哪些措施來改變這種情況
我發現了大約斯卡拉解析器組合和運營商關聯this討論,但它似乎並沒有給這裏回答我的問題。
我處理了同樣的問題,但是我能夠使用[this pdf](http: /www.scala-archive.org/attachment/1956909/0/packrat_parsers.pdf)。頁面21有一個很好的例子來構建。 –