2010-10-15 13 views
5

Chcę utworzyć token z '..' w lexer ANTLR3 który będzie używany do strunowych razem wyrażeń jakANTLR3 lexer pierwszeństwo

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

Więc dodałem,

DOTDOTSEP : '..' 
      ; 

Problemem jest to, że już zasadę:

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

w przykładzie I [3] I powyżej 1..2 s jest dopasowywany jako FLOAT (nie jestem pewien dlaczego od pierwszego . jest inny . nie jest INT, ale jest).

Zastanawiam się, czy istnieje sposób na zmianę pierwszeństwa reguł dla lexerów, aby DOTDOTSEP został dopasowany pierwszy, a następnie FLOAT.

Szukam here wydaje się, że tracę, "The rule having the greatest count is the winner.",, ale zastanawiam się, czy istnieje sposób obejścia go.

P.S. INT jest zdefiniowany jak poniżej ...

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

INT : DIGIT+ 
    ; 

Edycja. Trochę dalszych testów sprawia, że ​​myślę, że to nie jest tak proste, jak bezpośrednie dopasowanie do reguły FLOAT. (Zamierzałem zmienić pytanie, ale skoro mam odpowiedzi teraz, nie zrobię tego.) Problem (jak sądzę) wciąż leży w precedensie reguł leksykalnych, więc pytanie pozostaje takie samo.

Odpowiedz

7

Czy patrzysz na http://sds.sourceforge.net/src/antlr/doc/lexer.html?

Możliwym rozwiązaniem jest zdefiniowanie następujących czynności:

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

Że coraz bliżej mi dużo, tylko trochę bardziej szczypanie potrzebne. Link, którego nie znalazłem, ale wygląda świetnie; po prostu coś, co powinienem czytać, więc teraz mam zamiar to zrobić. Dzięki. – tjm

+0

Mam teraz ładnie, tylko kilka notatek dla każdego, kto może przez to przyjść. W ANTLRWorks v1.4 interpreter nie może zajmować się predykatami, więc wygląda na to, że są błędy, gdy ich nie ma (spowolniło to nieco), a także musiałem zmienić '$ settype (TYPE);' na ' $ type = TYPE; ' – tjm

+0

@tjm, Edytowałem trochę próbki ANTLR. Czy teraz jest kompatybilny z V3? –