Antlr4访问多个规则上下文

Antlr4访问多个规则上下文,antlr4,Antlr4,我的语法是这样的: search : K_SEARCH entity ( K_QUERY expr )? ( K_FILTER expr )? ; 如您所见,我有两个可选的expr 我已经创建了我的访问者,并且能够访问实体、K\u查询和K\u过滤器SearchContext提供一个列表,以获取所有expr的列表。但是,我如何知道表达式是K_查询表达式还是K_过滤器表达式 public class LivingQueryVisitor extends LivingDSLBaseVisito

我的语法是这样的:

search
 : K_SEARCH entity
 ( K_QUERY expr )?
 ( K_FILTER expr )?
;
如您所见,我有两个可选的
expr

我已经创建了我的访问者,并且能够访问
实体
K\u查询
K\u过滤器
SearchContext
提供一个
列表
,以获取所有
expr
的列表。但是,我如何知道表达式是
K_查询表达式
还是
K_过滤器表达式

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);
    }
}
公共类LivingQueryVisitor扩展了LivingDSLBaseVisitor{
@凌驾
公共无效访问搜索(SearchContext ctx){
this.query=search(this.getEntityPath(ctx));
//???????????????????????
List exprs=ctx.expr();
//???????????????????????
返回超级访问搜索(ctx);
}
}

有什么想法吗?

如果您现在想更改语法,使您能够以更优雅的方式进行操作,您可以使用index。由于规则中有两个“expr”,因此expr[0]将是K_查询表达式,expr[1]将是K_过滤器表达式,前提是两个令牌都存在。(K_查询和K_过滤器)


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

只需标记这两个
expr
术语即可

search : K_SEARCH entity
       ( K_QUERY  q=expr )?
       ( K_FILTER f=expr )?
;
Antlr将在SearchContext类中生成两个附加变量:

ExprContext q;
ExprContext f;

如果对应的子项匹配,则这些值将不为空。

搜索
的完整规则,还是在
(K\u QUERY expr)?
(K\u FILTER expr)?
行之前缺少
。我问了另一个问题。