绑定规则的 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 )* )?
;
如你所见,我有两个可选表达式。
我已经创建了我的访客,我可以访问实体 K_QUERY 和 K_FILTER。 SearchContext 提供了一个 List 以获取所有 expr 的列表。但是,如何绑定 K_QUERY
、K_FILTER
的表达式? 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---
.
类似的东西:
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 中生成这些附加变量 class:
ExprContext q;
ExprContext f;
List<ExprContext> s1;
List<ExprContext> s2;
List<ExprContext> s3;
这些值将是非空值 iff 相应的子项匹配。
我有这样的语法:
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 )* )?
;
如你所见,我有两个可选表达式。
我已经创建了我的访客,我可以访问实体 K_QUERY 和 K_FILTER。 SearchContext 提供了一个 List 以获取所有 expr 的列表。但是,如何绑定 K_QUERY
、K_FILTER
的表达式? 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---
.
类似的东西:
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 中生成这些附加变量 class:
ExprContext q;
ExprContext f;
List<ExprContext> s1;
List<ExprContext> s2;
List<ExprContext> s3;
这些值将是非空值 iff 相应的子项匹配。