Я использую PackratParsers в Scala (комбинаторы синтаксического анализа) с левой рекурсией грамматикой следующей формы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), ...)
.
Удивительно, что с грамматикой PackratParsers, как определено выше, полученный АСТ по-прежнему является право-ассоциативным. Почему это так и что можно сделать, чтобы изменить это?
Я нашел this обсуждение компиляторов синтаксического анализатора и ассоциативности операторов, но, похоже, это не дает ответа на мою проблему.
Я имел дело с одной и той же проблемой, но я смог ее решить, используя [this pdf] (http://www.scala-archive.org/attachment/1956909/0/packrat_parsers.pdf). У нас есть отличный пример для создания. –