Добавление нового формата даты в 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?
;