這是Jison中的解析器,但我猜這同樣適用於Bison。在遞歸規則中組合類似的構造
我有一個規則有一個表達式的定義。
expr
: NUMBER -> { type: "number", value: $1 }
| "(" expr ")" -> $2
| expr "+" expr -> { type: "+", left: $1, right: $3 }
| expr "-" expr -> { type: "-", left: $1, right: $3 }
| expr "*" expr -> { type: "*", left: $1, right: $3 }
| expr "/" expr -> { type: "/", left: $1, right: $3 }
;
我同樣的語法我也有一個「過濾表達式」,也支持「參數」的規則。
filterExpr
: NUMBER -> { type: "number", value: $1 }
| PARAM -> { type: "param", name: $1 } /* parameter */
| "(" filterExpr ")" -> $2
| filterExpr "+" filterExpr -> { type: "+", left: $1, right: $3 }
| filterExpr "-" filterExpr -> { type: "-", left: $1, right: $3 }
| filterExpr "*" filterExpr -> { type: "*", left: $1, right: $3 }
| filterExpr "/" filterExpr -> { type: "/", left: $1, right: $3 }
;
這有效,但是當我添加運算符時,我必須更改這兩個定義。有沒有辦法在語法中結合「expr」和「filterExpr」的共同部分?
這麼長的故事,簡單的Jison是不可能的,並且需要定製的語法預處理? – rveerd
@ rveerd:是的,就是這樣。但對於野牛來說,自定義預處理可能很簡單,使其值得。 – rici