2010-10-15 16 views
5
Ben Yani, eklemiş

ANTLR3 lexer öncelik

a..b  // [1] 
c .. x // [2] 
1..2  // [3] 
3 .. 4 // [4] 

gibi dize birlikte ifadeleri için kullanılacak ANTLR3 lexer içinde '..' bir belirteç oluşturmak istiyorum

,

DOTDOTSEP : '..' 
      ; 

sorundur zaten bir kural olduğunu:

FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f')) 
     ; 

Ve örnekte

[3] 1..2 yukarıdaki i FLOAT olarak eşleşiyor (Neden ilk .'u izlediğinden bu yana bir INT değil, başka bir . olduğundan emin değilim).

Lexer kurallarının önceliğini değiştirmenin bir yolu olup olmadığını merak ediyorum, bu nedenle DOTDOTSEP önce eşleşti ve ardından FLOAT.

Görünüşe göre here Görünüşe göre, "The rule having the greatest count is the winner.",'u kaybediyorum ama etrafta bir yol olup olmadığını merak ediyorum.

P.S. INT ... aşağıda

fragment DIGIT 
    : '0'..'9' 
    ; 

INT : DIGIT+ 
    ; 

Edit tanımlanır. Biraz daha fazla test yapmam, bana FLOAT kuralı ile doğrudan eşleşmesi kadar basit olmadığını düşünmemi sağlıyor. (Soruyu değiştirecektim ama şimdi cevaplarım var, ben yapmayacağım.) Sorun hala (inanıyorum) hala lexer kurallarının önceliğinde yatıyor, bu yüzden soru hala aynı kalıyor.

cevap

7

http://sds.sourceforge.net/src/antlr/doc/lexer.html'a baktınız mı?

bana çok daha yakın gidiyor
fragment 
INT : DIGIT+ 
    ; 

fragment 
RANGE : INT DOTDOTSEP INT 
     ; 

fragment 
FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f')) 
     ; 

NUMBER 
    : (INT '.') => FLOAT  { $type=FLOAT; } 
    | (INT DOTDOTSEP) => RANGE { $type=RANGE; } 
    | INT      { $type=INT; } 
    ; 
+0

, sadece biraz daha ince ayar gerekli:

Muhtemel bir çözüm aşağıdaki tanımlamaktır. Bulmadığım bağlantı ama harika görünüyor; Sadece okumam gereken bir şey, o yüzden şimdi bunu yapmaktan vazgeçtim. Teşekkürler. – tjm

+0

Şimdi güzelce gidiyorum, bununla gelebilecek herkes için sadece birkaç not. ANTLRWorks v1.4'te, yorumlayıcı yüklemelerle başa çıkamaz, bu nedenle (o zaman beni yavaşlattı) hatalar var gibi görünüyor ve ayrıca $ settype (TYPE); $ type = TYPE; ' – tjm

+0

@tjm, ANTLR örneğini biraz düzenledim. Şimdi v3 uyumlu mu? –

İlgili konular