将新的日期格式添加到Natty DateParser

时间:2017-03-03 12:27:23

标签: java parsing antlr natty

对于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

     

结果,对该输入禁用了备选方案2   警告(200):com \ joestelmach \ natty \ generated \ DateParser.g:444:73:   决策可以匹配输入,例如" COMMA WHITE_SPACE INT_00 {INT_13..INT_19,INT_20..INT_23}"使用多种替代方案:1,2

     

结果,对该输入禁用了备选方案2   警告(200):com \ joestelmach \ natty \ generated \ DateParser.g:496:45:   决策可以匹配输入,例如" WHITE_SPACE IN {COMMA,WHITE_SPACE}"使用多种替代方案:1,2

     

结果,对该输入禁用了备选方案2   警告(200):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:决定无法区分替代(s)1,2的输入,例如" INT_00 INT_00 INT_00 EOF&#34 ;

查看第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?
;

0 个答案:

没有答案