Antlr4 Visitor 几个规则上下文
Antlr4 Visitor several rule contexts
我有这样的语法:
search
: K_SEARCH entity
( K_QUERY expr )?
( K_FILTER expr )?
;
如您所见,我有两个可选 expr
。
我已经创建了我的访客,我可以访问 entity
、K_QUERY
和 K_FILTER
。 SearchContext
提供一个List<ExprContext>
以获得所有expr
的列表。但是,我怎么知道 with expression 是 K_QUERY expr
还是 K_FILTER expr
?
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);
}
}
有什么想法吗?
如果您现在确实想要更改语法,使您能够以更优雅的方式进行操作,您可以只使用 index.html。由于规则中有两个 'expr',如果两个标记都存在,您的 expr[0] 将是 K_Query 表达式,expr[1] 将是 K_filter 表达式。 (K_Query 和 K_filter)。
如果不是,expr[0]将是现有令牌的表达式。
只需标记两个 expr
项。
search : K_SEARCH entity
( K_QUERY q=expr )?
( K_FILTER f=expr )?
;
Antlr 将在 SearchContext 中生成两个额外的变量 class:
ExprContext q;
ExprContext f;
这些值将是非空值 iff 相应的子项匹配。
我有这样的语法:
search
: K_SEARCH entity
( K_QUERY expr )?
( K_FILTER expr )?
;
如您所见,我有两个可选 expr
。
我已经创建了我的访客,我可以访问 entity
、K_QUERY
和 K_FILTER
。 SearchContext
提供一个List<ExprContext>
以获得所有expr
的列表。但是,我怎么知道 with expression 是 K_QUERY expr
还是 K_FILTER expr
?
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);
}
}
有什么想法吗?
如果您现在确实想要更改语法,使您能够以更优雅的方式进行操作,您可以只使用 index.html。由于规则中有两个 'expr',如果两个标记都存在,您的 expr[0] 将是 K_Query 表达式,expr[1] 将是 K_filter 表达式。 (K_Query 和 K_filter)。
如果不是,expr[0]将是现有令牌的表达式。
只需标记两个 expr
项。
search : K_SEARCH entity
( K_QUERY q=expr )?
( K_FILTER f=expr )?
;
Antlr 将在 SearchContext 中生成两个额外的变量 class:
ExprContext q;
ExprContext f;
这些值将是非空值 iff 相应的子项匹配。