使用以下规则:
expr:
'(' expr ')' #exprExpr
| expr ( AND expr )+ #exprAnd
| expr ( OR expr )+ #exprOr
| atom #exprAtom
| ID #exprId
;
atom:
'[' ID RELOP INT ']'
;
我想允许这样的陈述:
[a<3] and [b<4]
[a<3] or [b<4]
[a<3] or ([b<4]and [c<5])
但禁止这样的陈述:
[a<3] or [b<4] and [c<5]
这个基本思想似乎适用于这种语法。但是有一个方面/副作用,我不明白:
在解析具有 3 个原子(如 atom1 和 atom2 和 atom3)的代码时,方法 exprAnd ist 调用了两次(不是一次,正如我所期望的那样)。
所以这样的代码:
public String visitExprAnd(myParser.ExprAndContext ctx) {
String res = "";
int type=-1;
int nAtoms = ctx.atom().size();
for (int i=0;i<nAtoms;i++) {
String s = visit(ctx.expr(i));
}
return s;
}
不适用于一次所有的 and 表达式。
所以不知何故,我会期望 exprAnd 和 exprOr 规则更加贪婪。
一个人怎么能做到这一点?