Я хочу создать токен из '..'
в 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
. (Я собирался изменить вопрос, но, поскольку теперь у меня есть ответы, не буду.) Проблема (я полагаю) все еще заключается в приоритете правил лексера, поэтому вопрос остается прежним.