Всякий раз, когда 2 (или более) правила соответствуют одному и тому же количеству символов, первое определенное правило «выиграет». Итак, если вы определите RESERVED_WORD
до ID
, например:
RESERVED_WORD : 'class' | 'public' | 'static' | 'extends' | 'void' | 'int' | 'boolean' | 'if' | 'else' | 'while' | 'return' | 'null' | 'true' | 'false' | 'this' | 'new' | 'String' ;
ID : LETTER (LETTER | DIGIT)* ;
fragment DIGIT : '0'..'9' ;
fragment LETTER : 'a'..'z' | 'A'..'Z' ;
Вход "class"
будет размечен как RESERVED_WORD
.
Обратите внимание, что не имеет смысла создавать отдельный токен, который соответствует любому зарезервированному слову: обычно это делается так:
// ...
NULL : 'null';
TRUE : 'true';
FALSE : 'false;
// ...
ID : LETTER (LETTER | DIGIT)* ;
fragment DIGIT : '0'..'9' ;
fragment LETTER : 'a'..'z' | 'A'..'Z' ;
Теперь "false"
станет токеном FALSE
, а "falser"
* ID
.