Добавление нового формата даты в Natty DateParser

Я абсолютный новичок, когда дело доходит до Нетти и Антлера. До сих пор Натти была великолепна и без проблем разбирала свидания. Недавно мы начали получать новый формат даты и времени, который Натти с трудом извлекает.

Mon 29 Feb 09:00:00 2016

Он не может извлечь год, потому что он отделен от остальной части даты.

Я пытался добавить свой собственный формат в DateParser, где он мог бы использовать этот формат, как и любой другой.

Я сделал следующие изменения:

date_time: добавлено дополнительное правило под названием custom_dates, которое будет новым правилом для моего формата

date_time
: (
    (date)=>date (date_time_separator explicit_time)?
    | explicit_time (time_date_separator date)?
    | custom_dates
  ) -> ^(DATE_TIME date? explicit_time?)
| relative_time -> ^(DATE_TIME relative_time?)
;

custom_date: мое новое правило

custom_date
: relaxed_day_of_week WHITE_SPACE relaxed_day_of_month WHITE_SPACE relaxed_month (date_time_separator explicit_time)? relaxed_year
 -> ^(EXPLICIT_DATE relaxed_day_of_week relaxed_day_of_month relaxed_month relaxed_year (date_time_separator explicit_time)?)

;

Когда я пытаюсь собрать Natty с моими изменениями, он просто зависает и никогда не заканчивается. Выход до этого момента:

Решение может соответствовать входным данным, таким как "COMMA WHITE_SPACE INT_00 INT_00", используя несколько альтернатив: 1, 2

В результате альтернатива (ы) 2 были отключены для этого предупреждения о входном сигнале (200): com\joestelmach\natty\generate \DateParser.g:444:73: решение может соответствовать входному значению, например "COMMA WHITE_SPACE INT_00 {INT_13..INT_19, INT_20..INT_23}"используя несколько альтернатив: 1, 2

В результате альтернатива (ы) 2 были отключены для этого предупреждения о входном сигнале (200): com\joestelmach\natty\generate \DateParser.g:496:45: решение может соответствовать входным данным, таким как "WHITE_SPACE IN {COMMA, WHITE_SPACE}" используя несколько альтернатив: 1, 2

В результате альтернатива (ы) 2 были отключены для этого предупреждения о входном сигнале (200): com\joestelmach\natty\generate \DateParser.g:504:77: решение может соответствовать входным данным, таким как "WHITE_SPACE IN {COMMA, WHITE_SPACE}" используя несколько альтернатив: 1, 2

В результате альтернатива (ы) 2 были отключены для этого ввода

Могу ли я пойти по этому поводу неправильно? Я взглянул на документацию по Natty и ANTLR v3, но не так много.

заранее спасибо

РЕДАКТИРОВАТЬ:

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

Первое предупреждение появляется в date_time_separator

date_time_separator
: WHITE_SPACE (AT WHITE_SPACE)?
| WHITE_SPACE? COMMA WHITE_SPACE? (AT WHITE_SPACE)?
| T
;

Одно наблюдение я сделал, когда я изменил свое правило, чтобы всегда включать время

custom_date
: relaxed_day_of_week WHITE_SPACE relaxed_day_of_month WHITE_SPACE relaxed_month (date_time_separator explicit_time) relaxed_year 
 -> ^(EXPLICIT_DATE relaxed_day_of_week relaxed_day_of_month relaxed_month relaxed_year (date_time_separator explicit_time)?)
;

Когда я компилирую, я получаю эту ошибку:

ошибка (202): com\joestelmach\natty\generate \DateParser.g:831:3: решение не может различить альтернативу (ы) 1,2 для ввода, например "INT_00 INT_00 INT_00 EOF"

Посмотрите на строку 831, где находится явное время. Я не могу найти что-либо на Stackru или как-то иначе, что означает эта ошибка. Я предполагаю, что эта ошибка означает, что существует некоторая неопределенность между двумя возможными маршрутами. Однако я не понимаю, почему простое добавление в мой код может вызвать ошибку.

explicit_time_hours_minutes returns [String hours, String minutes, String ampm]
: hours (COLON | DOT)? minutes ((COLON | DOT)? seconds)? (WHITE_SPACE (meridian_indicator | (MILITARY_HOUR_SUFFIX | HOUR)))?
  {$hours=$hours.text; $minutes=$minutes.text; $ampm=$meridian_indicator.text;}
  -> hours minutes seconds? meridian_indicator?

| hours (WHITE_SPACE? meridian_indicator)?
  {$hours=$hours.text; $ampm=$meridian_indicator.text;}
  -> hours ^(MINUTES_OF_HOUR INT["0"]) meridian_indicator?
;

0 ответов

Другие вопросы по тегам