Как реализовать оператор в с помощью ANTLR - PullRequest
0 голосов
/ 30 марта 2020

Я разрабатываю DSL с ANTLR и хочу реализовать оператор 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) { }

1 Ответ

0 голосов
/ 31 марта 2020

Как вы уже реализовали, 2,3,4 - это один токен. Это не то, что вы хотите. Это действительно должно быть правило синтаксического анализатора:

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

Возможно, вы хотите, чтобы ваши операторы сравнения имели одинаковый приоритет, поэтому вы можете заключить их в один альт:

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

И #... метки в конце правил приведут к замене 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());
  }
}
...