绑定规则的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 )* )?
;
如您所见,我有两个可选的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
或K---
之后是否要访问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屋!