Перевод семантического предиката из Antr3 в Antr4

В моей грамматике Antlr3 я использовал следующее правило лексера для распознавания постоянного периода даты, такого как «1 ГОД 4 МЕСЯЦА»:

(DATE_PERIOD_CONSTANT)=> DATE_PERIOD_CONSTANT ((' '+ DATE_PERIOD_CONSTANT)=> ' '+ DATE_PERIOD_CONSTANT)*

(Спасибо, где должно быть, от Барта Кирса).

К сожалению, этот синтаксис исчез в ANTLR4. Итак, я безуспешно пробовал следующее:

DATE_PERIOD_CONSTANT
: (INTEGER ' '+ (YEAR | MONTH | WEEK | DAY))+
| {getText().matches("(\\d+ (YEAR(S)?|MONTH(S)?|WEEK(S)?|DAY(S)?))+")}? INTEGER
;

INTEGER
    : DIGIT+
    ;

 fragment DIGIT:'0'..'9';

// YEAR/MONTH/WEEK/DAY definition

Это тоже было безуспешно.

Может ли кто-нибудь помочь мне перевести в новый формат?

Джейсон


person Jason    schedule 14.03.2013    source источник


Ответы (1)


В примере правила лексера используются синтаксические предикаты, а не семантические предикаты. Они не нужны в ANTLR 4 из-за его значительно улучшенной способности просмотра вперед. Все, что вам нужно сделать, это удалить их:

DATE_PERIOD_CONSTANT (' '+ DATE_PERIOD_CONSTANT)*
person Sam Harwell    schedule 14.03.2013