次のルールを使用します。
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]
この基本的な考え方は、この文法でうまくいくようです。しかし、私が理解していない側面/副作用が1つあります。
3 つのアトム (atom1、atom2、atom3 など) でコードを解析している間、メソッド exprAnd は 2 回呼び出されます (1 回ではなく、1 回ではないと思います)。
したがって、次のようにコードします。
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 ルールがより貪欲であると予想していたでしょう。
どうすればこれを達成できますか?