規則

2016-04-07 103 views
1

的綁定ANTLR4子規則我有一個語法像:規則

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)*)? 
; 

正如你可以看到我已經兩個可選的EXPR。

我創建了我的訪問者,並且我可以訪問實體,K_QUERY和K_FILTER。 SearchContext提供了一個List來獲取所有expr的列表。但是,如何綁定哪個表達式適用於K_QUERYK_FILTERK_SELECT1,K_SELECT2,K_SELECT3的exprs怎麼辦?

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); 
    } 
} 

我正在尋找一種方式,以便讓遊客能夠經過解析樹,並在同一檢測我是否前往EXPR必須走訪K_SEARCH,或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; 
    } 
} 

任何想法?

+0

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

+0

我相信,這個問題有點不同。 – Jordi

回答

2

使用列表標籤

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類中的這些額外的變量:

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

值將爲非空當且僅當匹配相應的subterms。