绑定规则的ANTLR4子规则 [英] Bind ANTLR4 subrules of a rule

查看:33
本文介绍了绑定规则的ANTLR4子规则的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的语法:

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 )* )?
;

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

As you can see I've two optional expr.

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

I've created my Visitor, and I'm able to get access to entity, K_QUERY and K_FILTER. SearchContext provides a List in order to get a list of all expr. However, how can I bind which expression is for K_QUERY, K_FILTER? What about the exprs of 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---.

I'm looking for a way in order for visitor to be able to go through the Parse Tree and at the same detecting whether I'm visiting a expr after have to be visited a K_SEARCH, or 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 类中生成这些附加变量:

Antlr will generate these additional variables within the SearchContext class:

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

值将是非空的 iff 匹配的相应子项.

The values will be non-null iff the corresponding subterms matched.

这篇关于绑定规则的ANTLR4子规则的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆