Просто измените порядок, в котором определены токены ID и INT.
grammar qqq;
// Parser's rules.
root:
(integer|identifier)+
;
integer:
INT {System.out.println("INT with text '"+$INT.text+"'.");}
;
identifier:
ID {System.out.println("ID with text '"+$ID.text+"'.");}
;
// Lexer's tokens.
INT: '0'..'9'+
;
ID: ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')
('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '&' | '/' | '-' | '.')*
;
WS: ' ' {skip();}
;
UNPREDICTED_TOKEN
:
~(' ') {System.out.println("Unpredicted token.");}
;
Порядок, в котором токены определены в грамматике, имеет значение: в случае, если строку можно отнести к нескольким токенам, она присваиваетсяк тому, который определен первым.В вашем случае, если вы хотите, чтобы целое число «123» относилось к INT, когда оно все еще соответствует ID - сначала укажите определение INT.
Соответствие токена Antlr является жадным, поэтому оно не остановится на «123» в«123BOB», но будет продолжаться до тех пор, пока ни один из токенов не совпадет со строкой и не возьмет последний соответствующий токен.Таким образом, ваши идентификаторы теперь могут начинаться с цифр.
Замечание о порядке токенов также можно найти в этой статье Марка Фолькмана .