Scala rep()和关联性

时间:2013-09-29 04:51:44

标签: scala grammar context-free-grammar bnf

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

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

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

语法是递归的,因此它会导致无限递归。我可以重写以删除左递归,但它将更改为正确的关联性。

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

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

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

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

1 个答案:

答案 0 :(得分: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) }
)