Приоритет лексера ANTLR3

Я хочу создать токен из '..' в ANTLR3 лексер, который будет использоваться для объединения выражений типа

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

Итак, я добавил,

DOTDOTSEP : '..' 
          ;

Проблема в том, что у меня уже есть правило:

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

И в примере [3] выше 1..2 сопоставляется как FLOAT (я не уверен, почему после первого . - это еще один . не INT, но это так).

Интересно, есть ли способ изменить приоритет правил лексера так, чтобы сначала выполнялось сопоставление DOTDOTSEP , а затем FLOAT .

Смотрим здесь кажется, я проигрываю «Правило, имеющее наибольшее количество очков, побеждает», , но интересно, есть ли способ обойти это.

PSINT определяется следующим образом ...

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

INT : DIGIT+
    ;

Edit. Небольшое дополнительное тестирование заставляет меня думать, что это не так просто, как прямое сопоставление с правилом FLOAT . (Я собирался изменить вопрос, но, поскольку теперь у меня есть ответы, не буду.) Проблема (я полагаю) все еще заключается в приоритете правил лексера, поэтому вопрос остается прежним.

5
задан tjm 15 October 2010 в 13:03
поделиться