绑定规则的 ANTLR4 子规则

Bind ANTLR4 subrules of a rule

我有这样的语法:

living
   : search EOF
   ;

search
 : K_SEARCH entity
 ( K_QUERY expr )?
 ( K_FILTER expr )?
 ( K_SELECT1 expr ( COMMA expr )* )?
 ( K_SELECT2 expr ( COMMA expr )* )?
 ( K_SELECT3 expr ( COMMA expr )* )?
;

如你所见,我有两个可选表达式。

我已经创建了我的访客,我可以访问实体 K_QUERY 和 K_FILTER。 SearchContext 提供了一个 List 以获取所有 expr 的列表。但是,如何绑定 K_QUERYK_FILTER 的表达式? K_SELECT1, K_SELECT2, K_SELECT3.

的表达式呢
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);
   }
}

我正在寻找一种方法,以便访问者能够通过解析树,同时检测我是否在必须访问 K_SEARCH 之后访问 expr,或者K---.

类似的东西:

String currentClause;

visitLiving(LivingContext ctx)
{
    //????
}

visitSearch(SearchContext ctx)
{
    //set current cluase
    this.currentCluase = ???
}

visitExpr(ExprContext ctx)
{
    switch (this.currentClause)
    {
        case "K_SEARCH":
           break;
        case "K_QUERY":
           break;
        case "K_FILTER":
           break;
        case "K_SELECT":
           break;
    }
}

有什么想法吗?

使用列表标签

search : K_SEARCH entity
     ( K_QUERY  q=expr )?
     ( K_FILTER f=expr )?
     ( K_SELECT1 s1+=expr ( COMMA s1+=expr )* )?
     ( K_SELECT2 s2+=expr ( COMMA s2+=expr )* )?
     ( K_SELECT3 s3+=expr ( COMMA s3+=expr )* )?
;

Antlr 将在 SearchContext 中生成这些附加变量 class:

ExprContext q;
ExprContext f;
List<ExprContext> s1;
List<ExprContext> s2;
List<ExprContext> s3;

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