2016-04-07 4 views
1

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?

+0

http://stackoverflow.com/questions/36445688/antlr4-visitor-several-rule-contexts – Divisadero

+0

Ich glaube, es ist ein bisschen anders diese Frage. – Jordi

Antwort

2

Verwenden Liste Etiketten

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 werden diese zusätzlichen Variablen innerhalb der Klasse SearchContext erzeugen:

ExprContext q; 
ExprContext f; 
List<ExprContext> s1; 
List<ExprContext> s2; 
List<ExprContext> s3; 

Die Werte werden nicht-null iff die entsprechenden Teiltermen abgestimmt.