1

次のルールを使用します。

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 ルールがより貪欲であると予想していたでしょう。

どうすればこれを達成できますか?

4

1 に答える 1