2013-09-29 97 views
0

我想在斯卡拉StdTokenParsers表達這種語法:斯卡拉代表()和結合

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

「+」 和 「 - 」 是左結合。

語法是遞歸的,因此它引起了無限遞歸。我可以重寫刪除左遞歸,但它會更改爲右關聯性。

現在我計劃使用Scala的代表()來重寫爲:

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

反而會代表(),它改變關聯? rep()在這種情況下如何工作?

我在問這個問題,因爲我必須在將來輸出AST。

回答

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) } 
)