【发布时间】:2016-03-11 04:39:10
【问题描述】:
我正在使用具有以下形式的左递归语法的 Scala 的 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 讨论了有关 Scala 解析器组合器和运算符关联性的讨论,但它似乎没有在这里回答我的问题。
【问题讨论】:
-
我处理了同样的问题,但我能够使用this pdf 解决它。第 21 页有一个很好的例子。
标签: scala parser-combinators left-recursion