Вы должны понимать, что правила lexer ANTLR соответствуют их позиции в файле грамматики. Лексер не «слушает» то, что может понадобиться парсеру в определенной позиции в правиле парсера. Лексер пытается сопоставить как можно больше символов, и когда 2 (или более) правила совпадают с одинаковым количеством символов, первое правило будет побеждено.
В вашем случае это означает, что 15
будет всегда обозначаться как TimeDate
и никогда не как TimeYear
, потому что оба правила соответствуют 15
, но сначала определяется TimeDate
. 2015
будет обозначаться как TimeYear
, потому что никакое другое правило не соответствует 4 цифрам.
Решение было бы изменить TimeYear
на правило парсера:
timeYear
: TimeDate TimeDate?
;