Ich habe eine Grammatik wie folgt aus:Bind ANTLR4 Unterregeln einer Regel
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)*)?
;
Wie Sie ich habe zwei optionale ausdr sehen können.
Ich habe meinen Besucher erstellt, und ich kann auf Entity, K_QUERY und K_FILTER zugreifen. SearchContext stellt eine Liste zur Verfügung, um eine Liste aller Ausdrucke zu erhalten. Wie kann ich jedoch binden, welcher Ausdruck für K_QUERY
, K_FILTER
ist? Was ist mit den Exprs von 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);
}
}
Ich bin für einen Weg, um Besucher suchen, um der Lage sein, den Parse-Baum zu durchlaufen und gleichzeitig detektieren, ob ich eine ausdr Besuch nach einer K_SEARCH
werden besucht haben oder K---
.
So etwas:
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;
}
}
Irgendwelche Ideen?
http://stackoverflow.com/questions/36445688/antlr4-visitor-several-rule-contexts – Divisadero
Ich glaube, es ist ein bisschen anders diese Frage. – Jordi