如何用ANTLR实现operator in

How to implement the operator in with ANTLR

我正在使用 ANTLR 开发 DSL,我想实现 in 运算符,这是我的语法

x = 3
where x in 2,3,4

这是我的部分语法。

expr    : ID       GT   DATA NEWLINE
        | ID       LT   DATA NEWLINE
        | ID       GTEQ DATA NEWLINE
        | ID       LTEQ DATA NEWLINE
        | ID       IN   LIST NEWLINE
        ;
GT      : '>';  
LT      : '<';  
GTEQ    : '>=';  
LTEQ    : '<=';
IN      : 'in';
LIST    : DATA ',' DATA (',' DATA)* ; // list of variables
DATA    : '"' ID '"' | '"' INT '"';
ID  :   [a-zA-Z]+ ; 
INT :   [0-9]+ ;  

如何在 entryExpr 方法中获取变量列表,在我们的示例中 list = [2,3,4]

@Override public void enterExpr(StudyParser.ExprContext ctx) { }

正如您现在实施的那样,2,3,4 是单个令牌。这不是你想要的。它真的应该是一个解析器规则:

list : DATA ',' DATA (',' DATA)*;

您可能希望比较运算符具有相同的优先级,因此您可以将它们包装在一个 alt 中:

expr : ID (GT | LT | GTEQ | LTEQ) DATA NEWLINE  #exprComp
     | ID IN list NEWLINE                       #exprIn
     ;

而规则的#... labels at the end会导致void enterExpr(StudyParser.ExprContext ctx)被以下2种方法代替:

void enterExprComp(StudyParser.ExprCompContext ctx);

void enterExprIn(StudyParser.ExprInContext ctx);

enterExprIn 的实施中,您现在可以:

@Override 
public void enterExprIn(StudyParser.ExprInContext ctx) {
  for (TerminalNode node : ctx.list().DATA()) {
    System.out.println(node.getText());
  }
}