2010-10-25 15 views
7

. Ne yazık ki, küçük bir problemle karşılaştım. follwoing kuralı atın:ANTLR: tekil ve ikili operatörleri (örn. Eksi işareti) fark etme problemi, basit bir dilbilgisi ayrıştırmak için ANTLR (3.2) kullanarak kullanıyorum (örn. Eksi işareti)

exp 
: NUM 
| '(' expression OPERATOR expression ')' -> expression+ 
| '(' (MINUS | '!') expression ')' -> expression 
; 

OPERATÖR aynı eksi işareti içeriyor - EKSİ ile tanımlanır olarak (''). Şimdi ANTLR, bu iki kuralla başa çıkamayacak gibi görünüyor. Her ikisini de kaldırırsam her şey yolunda gider.

Fikirleri olan var mı?

cevap

9

Tekli ifadeyi en yüksek öncelikli olanı yapın. Ayrıca eksi daha iyi arasındaki farkı yapmak için - için farklı bir belirteç kullanıyorum. Bir demo:

grammar Exp; 

options { 
    output=AST; 
} 

tokens { 
    UNARY; 
} 

parse 
    : exp EOF 
    ; 

exp 
    : additionExp 
    ; 

additionExp 
    : multiplyExp ('+'^ multiplyExp | '-'^ multiplyExp)* 
    ; 

multiplyExp 
    : unaryExp ('*'^ unaryExp | '/'^ unaryExp)* 
    ; 

unaryExp 
    : '-' atom -> ^(UNARY atom) 
    | '!' atom -> ^('!' atom) 
    | atom 
    ; 

atom 
    : '(' exp ')' -> exp 
    | Number  -> Number 
    ; 

Number : ('0'..'9')+ ('.' ('0'..'9')+)? ; 

Spaces : (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;} ; 

kaynağı ile hızlı bir testi:

alt text

  • görüntü http://graph.gafol.net/
  • kullanılarak oluşturulan:

    3 * -4 + 7/6 * -(3 + -7 * (4 + !2)) 
    

    aşağıdaki AST üretti

+0

Vay, harika iş, çok teşekkür ederim! – Christian

+0

@Christian, rica ederim. –

+0

Ayrıca, bir UNARY örneğine karşılık gelirse eksi okurken tokenizatörün nasıl bilmesi gerekir? –

İlgili konular