谈到 Natty 和 Antler,我完全是新手。到目前为止,Natty 一直很棒,并且解析日期没有任何问题。最近,我们开始收到 Natty 无法提取的新日期和时间格式。
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
结果,该输入警告(200)禁用了备选方案 2:com\joestelmach\natty\generated\DateParser.g:444:73:决策可以匹配输入,例如“COMMA WHITE_SPACE INT_00 {INT_13..INT_19 , INT_20..INT_23}" 使用多种选择:1、2
结果,该输入警告(200)禁用了备选方案 2:com\joestelmach\natty\generated\DateParser.g:496:45:决策可以匹配输入,例如“WHITE_SPACE IN {COMMA, WHITE_SPACE}”使用多种选择:1、2
结果,该输入警告(200)禁用了备选方案 2:com\joestelmach\natty\generated\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\generated\DateParser.g:831:3:该决定无法区分输入的替代项 1,2,例如“INT_00 INT_00 INT_00 EOF”
查看第 831 行是 explicit_time 所在的位置。我在 StackOverflow 上找不到任何东西,或者这个错误意味着什么。我认为这个错误意味着两条可能的路线之间存在一些歧义。但是我不明白为什么仅仅添加我的代码会导致错误。
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?
;