如何用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());
}
}
我正在使用 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());
}
}