我有这样的语法:

search
 : K_SEARCH entity
 ( K_QUERY expr )?
 ( K_FILTER expr )?
;

如您所见,我有两个可选的expr

我已经创建了访问者,并且能够访问entityK_QUERYK_FILTERSearchContext提供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/

10-14 05:17