绑定规则的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 )* )?
;
如你所见,我有两个可选的表达式.
As you can see I've two optional expr.
我已经创建了我的访问者,并且能够访问实体、K_QUERY 和 K_FILTER.SearchContext 提供了一个 List 以获取所有 expr 的列表.但是,如何绑定 K_QUERY
、K_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屋!