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

查看:99
本文介绍了绑定规则的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 )* )?
;

如您所见,我有两个可选的expr.

As you can see I've two optional expr.

我已经创建了访问者,并且能够访问实体K_QUERY和K_FILTER. SearchContext提供一个List以获得所有expr的列表.但是,如何绑定K_QUERYK_FILTER的表达式? K_SELECT1K_SELECT2K_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_SEARCHK---之后是否要访问expr.

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天全站免登陆