我使用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有一个很好的例子来构建。 –