0

我想在 scala StdTokenParsers 中表达这个语法:

expr -> expr ("+"|"-") ~ muldivexpr | muldivexpr

“+”和“-”是左关联的。

语法是左递归的,所以它导致了无限递归。我可以重写以删除左递归,但它会更改为右关联性。

现在我打算使用 scala rep() 将其重写为:

expr -> rep(muldivexpr ("+"|"-")) ~ muldivexpr

但是会改变关联性的 rep() 吗?rep() 在这种情况下如何工作?

我问这个问题是因为我将来必须输出 AST。

4

1 回答 1

1

您最有可能在寻找:

chainl1[T](p: => Parser[T], q: => Parser[(T, T) => T]): Parser[T]

一般的想法是p一个操作数,并且q是一个分隔符,产生一个可以组合两个操作数的函数,例如

chainl1(muldivexpr,
  "+" ^^^ { (l: Expr, r: Expr) => Addition(l, r)    }
| "-" ^^^ { (l: Expr, r: Expr) => Subtraction(l, r) }
)
于 2013-09-29T05:57:11.670 回答