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)?
行之前缺少
。我问了另一个问题。