这是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