我有这样的语法:
search
: K_SEARCH entity
( K_QUERY expr )?
( K_FILTER expr )?
;
正如您所看到的,我有两个可选expr
。
我已创建了访问者,并且我能够访问entity
,K_QUERY
和K_FILTER
。 SearchContext
提供List<ExprContext>
以获取所有expr
的列表。但是,如何通过表达式了解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);
}
}
有什么想法吗?
答案 0 :(得分:4)
只标记两个expr
字词。
search : K_SEARCH entity
( K_QUERY q=expr )?
( K_FILTER f=expr )?
;
Antlr将在SearchContext类中生成另外两个变量:
ExprContext q;
ExprContext f;
值为非空 iff 相应的子符号匹配。
答案 1 :(得分:1)
如果您现在想要更改语法,使您能够以更优雅的方式执行此操作,则可以使用索引。由于规则中有两个'expr',因此expr [0]将为K_Query表达式,expr [1]将为K_filter expresssion,前提是存在两个令牌。 (K_Query和K_filter)。
如果不是,expr [0]将是现有令牌的表达。