ANTLR Как использовать правила лексера с одинаковым началом?

Как использовать правила лексера с одинаковым началом?

Я пытаюсь использовать два похожих правила лексера (с одинаковым началом):

TIMECONSTANT: ('0'..'9')+ ':' ('0'..'9')+;
INTEGER     : ('0'..'9')+;
COLON       : ':';

Вот пример моей грамматики:

grammar TestTime;

text      : (timeexpr | caseblock)*;

timeexpr  : TIME;
caseblock : INT COLON ID;

TIME      : ('0'..'9')+ ':' ('0'..'9')+;
INT       : ('0'..'9')+;
COLON     : ':';
ID        : ('a'..'z')+;

WS        : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;};

Когда я пытаюсь разобрать текст:

12:44
123 : abc
123: abc

Первые две строки анализируются правильно, третья -выдает ошибку. По какой-то причине '123 :' ANTLR анализирует как TIME (, хотя это не )...

Итак, можно ли сделать грамматику с такими лексемами?

Наличие таких правил необходимо в моем языке для использования блоков case -и констант даты и времени. Например на моем языке можно написать:

case MyInt of
  1: a := 01.01.2012;
  2: b := 12:44;
  3:....
end;
5
задан Astronavigator 6 April 2012 в 06:06
поделиться