我想在scala StdTokenParsers中表达这个语法:
expr -> expr ("+"|"-") ~ muldivexpr | muldivexpr
“+”和“ - ”是关联的。
语法是递归的,因此它会导致无限递归。我可以重写以删除左递归,但它将更改为正确的关联性。
现在我打算使用scala rep()将其重写为:
expr -> rep(muldivexpr ("+"|"-")) ~ muldivexpr
但会改变关联性的rep()吗? rep()在这种情况下如何工作?
我问这个问题,因为我将来必须输出AST。
答案 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) }
)