我有这样的语法:
search
: K_SEARCH entity
( K_QUERY expr )?
( K_FILTER expr )?
;
如您所见,我有两个可选的
expr
。我已经创建了访问者,并且能够访问
entity
,K_QUERY
和K_FILTER
。 SearchContext
提供List<ExprContext>
以获得所有expr
的列表。但是,我怎么知道表达式是K_QUERY expr
还是K_FILTER expr
?public class LivingQueryVisitor extends LivingDSLBaseVisitor<Void> {
@Override
public Void visitSearch(SearchContext ctx) {
this.query = search(this.getEntityPath(ctx));
//???????????????????????
List<ExprContext> exprs = ctx.expr();
//???????????????????????
return super.visitSearch(ctx);
}
}
有任何想法吗?
最佳答案
只需标记两个expr
术语即可。
search : K_SEARCH entity
( K_QUERY q=expr )?
( K_FILTER f=expr )?
;
Antlr将在SearchContext类内生成两个其他变量:
ExprContext q;
ExprContext f;
如果匹配的子项匹配,则这些值将为非null。
关于antlr4 - Antlr4 Visitor几个规则上下文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36445688/