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.
Ż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
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
@tjm, Edytowałem trochę próbki ANTLR. Czy teraz jest kompatybilny z V3? –