Когда есть 2 или более лексических правила, которые соответствуют одним и тем же символам, побеждает то, которое определено первым. В вашем случае эти 2 правила соответствуют 10
:
DECIMAL_LITERAL : DIGIT(DIGIT)*;
INT_LITERAL : DECIMAL_LITERAL | HEX_LITERAL;
, и, поскольку INT_LITERAL
определяется после DECIMAL_LITERAL
, лексер никогда не создаст токен INT_LITERAL
. Если теперь вы попытаетесь использовать его в правиле парсера, вы получите сообщение об ошибке, которое вы опубликовали.
Решение: удалите INT_LITERAL
из лексера и вместо этого создайте правило парсера:
int_literal : DECIMAL_LITERAL | HEX_LITERAL;
и используйте вместо него int_literal
в правилах парсера.