2016-04-06 14 views
2

kapsamları.Antlr4 Ziyaretçi birkaç kural böyle bir dilbilgisi ettik

Ziyaretçimi oluşturdum ve entity, K_QUERY ve K_FILTER erişimini alabiliyorum. SearchContext, expr'un tümünün bir listesini almak için List<ExprContext> sağlar. Ancak, ifade ile nasıl öğrenebilirim K_QUERY expr veya 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); 
    } 
} 

Herhangi bir fikir?

+0

'search' tam bir kural mı, yoksa' '' satırlardan önce '' '(K_QUERY expr)?' Ve '(K_FILTER expr)?' Dır. – cantSleepNow

cevap

4

Sadece iki expr terimini etiketleyin.

search : K_SEARCH entity 
     (K_QUERY q=expr)? 
     (K_FILTER f=expr)? 
; 

antlr SearchContext sınıfı içinde iki başka değişkenler oluşturur:

ExprContext q; 
ExprContext f; 

değerleri eşleşen boş olmayan IFF karşılık gelen alt terimleri olacaktır.

+0

[here] hakkında başka bir soru soruyorum (http://stackoverflow.com/questions/36468757/bind-antlr4-subrules-of-a-rule). – Jordi

1

Şimdi daha zarif bir şekilde yapabilmenizi sağlayacak dilbilgisini değiştirmek isterseniz, indeksi kullanabilirsiniz. Kuralda iki 'expr' olduğu için, exp [0] K_Query ifadesi olacak ve her iki belirteç mevcut olması koşuluyla expr [1] K_filter ifadesi olacaktır. (K_Query ve K_filter).

Değilse, expr [0] mevcut belirtecin ifadesi olacaktır.