gpt4 book ai didi

java - ANTLR4 重复 AND

转载 作者:行者123 更新时间:2023-11-30 06:13:38 31 4
gpt4 key购买 nike

遵循以下规则:

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 方法被调用了两次(不是一次,正如我所期望的那样)它到)。

所以代码如下:

 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 规则是更贪心。

如何才能实现这一目标?

最佳答案

but forbid statements like this:

[a<3] or [b<4] and [c<5]

最好在解析之后完成。你的语法接受这一点(而且应该)。您只需要随后遍历解析树并在树遍历过程中遇到它时拒绝它。

While parsing code with 3 atoms ( like atom1 and atom2 and atom3) the method exprAnd ist called twice (not once, as I would expect it to).

如果您想将这些 AND 分组在一起,您应该执行类似的操作,而不是将它们全部分组到单个 expr 规则中:

orExpr
: andExpr ( OR andExpr )*
;

andExpr
: atom ( AND atom )*
;

atom
: '(' expr ')' #atomExpr
| '[' ID RELOP INT ']' #atomBracket
| ID #atomId
;

编辑

一个完整的例子:

grammar Test;

parse
: expr EOF
;

expr
: orExpr
;

orExpr
: andExpr ( OR andExpr )*
;

andExpr
: atom ( AND atom )*
;

atom
: '(' expr ')' #atomExpr
| '[' expr RELOP expr ']' #atomBracket
| ID #atomId
| INT #atomInt
;

RELOP : [<>] '='?;
AND : 'and';
OR : 'or';
INT : [0-9]+;
ID : [a-zA-Z_] [a-zA-Z_0-9]*;
SPACE : [ \t\r\n] -> skip;

关于java - ANTLR4 重复 AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49721299/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com