Antlr4 Visitor 几个规则上下文

Antlr4 Visitor several rule contexts

我有这样的语法:

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

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

我已经创建了我的访客,我可以访问 entityK_QUERYK_FILTERSearchContext 提供一个List<ExprContext> 以获得所有expr 的列表。但是,我怎么知道 with expression 是 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);
    }
}

有什么想法吗?

如果您现在确实想要更改语法,使您能够以更优雅的方式进行操作,您可以只使用 index.html。由于规则中有两个 'expr',如果两个标记都存在,您的 expr[0] 将是 K_Query 表达式,expr[1] 将是 K_filter 表达式。 (K_Query 和 K_filter)。

如果不是,expr[0]将是现有令牌的表达式。

只需标记两个 expr 项。

search : K_SEARCH entity
       ( K_QUERY  q=expr )?
       ( K_FILTER f=expr )?
;

A​​ntlr 将在 SearchContext 中生成两个额外的变量 class:

ExprContext q;
ExprContext f;

这些值将是非空值 iff​​ 相应的子项匹配。