2016-04-14 6 views
0

olarak NULL ayrıştırmak. ayrıştırmak çalışırken, ŞimdiANTLR: Bir işlev adını ve ben bir <em>parametresi</em> (değer <em>boş</em>) ve benim dilbilgisi bir <em>işlev adını</em> hem de 'NULL' kullanabilmek için istiyorum bir parametre

grammar test; 

expr 
    : value # valueExpr 
    | FUNCTION_NAME '(' (expr (',' expr)*)* ')' # functionExpr 
    ; 


value 
    : INT 
    | 'NULL' 
    ; 

FUNCTION_NAME 
    : [a-zA-Z] [a-zA-Z0-9]* 
    ; 


INT: [0-9]+; 

: Bu azaltılmış örneğe bakın çözümleme ağacı başarısız içinde

NULL(1) 

Sonuçlar bir değeri ve bir fonksiyon adı olarak NULL ayrıştırır çünkü.

İdeal olarak, ben bile

bu mümkün olup olmadığını söyleyebilir ve evet, nasıl bunu gerçekleştirmek için .. NULL(NULL) ayrıştırmak gerekir?

cevap

0

senin dilbilgisi içinde 'NULL' dize örtük bir belirteç türünü tanımlar Yani, bu boyunca bir şey eklemeye eşdeğerdir var:

NULL: 'NULL'; 

lexer kurallarının başlangıcında. Bir jeton birden fazla lexer kuralına uyduğu zaman, ilki kullanılır, bu yüzden gramerinizde örtük kural öncelik kazanır ve 'NULL' türünde bir simge alırsınız.

function_name: FUNCTION_NAME | 'NULL'; 

ve sonra expr kuralda bu kullanın:

basit bir çözüm böyle bir ayrıştırıcı işlev adları için kural, bir şeyler tanıtmak olacaktır. Ancak, NULL'un dilbilgisinde bir anahtar kelime olması amaçlanmamışsa, bu kırılgan görünüyor. Buna başka bir çözüm de var, ama dilbilgisinin nasıl genişlemesini beklediğinizi bilmediğimden ne tavsiye edeceğime emin değilim.

Ama başka bir çözüm 'NAME' belirteç tip kurtulmak, NAME için FUNCTION_NAME yeniden adlandırın ve böyle expr yeniden yazmak olabilir:

expr 
    : value # valueExpr 
    | NAME '(' (expr (',' expr)*)* ')' # functionExpr 
    | {_input.LT(1).getText().equals("NULL")}? NAME # nullExpr 
    ; 

bir semantik yüklem burada adı karşılaştırma ilgilenir.

İlgili konular