Проблема в том, что лексер поглощает десятичную цифру и возвращает NumericLiteral.
Парсер никогда не увидит DecimalDigits, потому что это правило фрагмента.
Я бы порекомендовал переместить timeLiteral в лексер (с заглавной буквы). Так что у вас будет что-то вроде
timeLiteral
: TimeLiteral -> ^(TIMELIT TimeLiteral*)
;
number
: DecimalLiteral
;
TimeLiteral
: DecimalDigit DecimalDigit COLON
DecimalDigit DecimalDigit COLON
DecimalDigit DecimalDigit
;
DecimalLiteral
: DecimalDigit+ ('.' DecimalDigit+)?
;
fragment DecimalDigit
: ('0'..'9')
;
Имейте в виду, что лексер и парсер полностью независимы. Лексер определяет, какие токены будут переданы парсеру, , а затем парсер получит их для группировки.