Antlr4访客几个规则上下文

时间:2016-04-06 08:34:45

标签: antlr4

我有这样的语法:

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

正如您所看到的,我有两个可选expr

我已创建了访问者,并且我能够访问entityK_QUERYK_FILTERSearchContext提供List<ExprContext>以获取所有expr的列表。但是,如何通过表达式了解K_QUERY exprK_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);
    }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

只标记两个expr字词。

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

Antlr将在SearchContext类中生成另外两个变量:

ExprContext q;
ExprContext f;

值为非空 iff 相应的子符号匹配。

答案 1 :(得分:1)

如果您现在想要更改语法,使您能够以更优雅的方式执行此操作,则可以使用索引。由于规则中有两个'expr',因此expr [0]将为K_Query表达式,expr [1]将为K_filter expresssion,前提是存在两个令牌。 (K_Query和K_filter)。

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