我想使用 Antlr 解析一串法语日期。
我有三种类型的日期:
- date_day:2004 年 10 月 3 日(小时/分钟为午夜)
- date_time : 12h(日、月、年以当前日期完成)
- date_complete:2004 年 10 月 3 日 12 小时。如你看到的
date_complete : date_day date_hour
我要解析的文档只是一串date_day
,date_time
和date_complete
(没有分隔符)。
这是我要解析的字符串的示例
3 Octobre 2005 12h 13h 5 Octobre 2004 3 Septembre 2005 11h
Expected : date_complete date_time date_day date_complete
12h
Expected : date_time
3 Octobre 2005 5 Octobre 2004 12h 13h 3 Septembre 2005 11h
Expected : date_day date_complete date_time date_complete
**// NEW REQUIREMENTS**
3 Octobre 2005
Expected : date_day
3 Octobre
Expected : date_day
3
Expected : date_day
我尝试了很多东西,Antlr v3 总是说我的语法不明确:
warning(200): /meleo.dates/src/Grammar.g:25:48:
Decision can match input such as "{FRI, MON..TUE, WED} TWO_DIGITS DECEMBER FOUR_DIGITS {FRI..HOURG, MON..WED}" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
|---> date_day (date_day | date_complete | date_hour)+
写那个语法的正确方法是什么?
这是语法:
grammar MeleoDates;
options {
language = Java;
}
@header {
package meleo.data.dates ;
import rainstudios.meleo.crawler.data.Dates ;
import rainstudios.meleo.crawler.data.EventDate ;
}
@lexer::header {
package meleo.data.dates ;
import rainstudios.meleo.crawler.data.EventDate ;
}
input returns [Dates dates]
@init {Dates r = new Dates() ; } :
( date
{r.addDay($date.date);}
DATE_SEP?)+
EOF
{$dates = r ;}
;
date returns [EventDate date] :
(date_complete)=> date_complete
{$date = $date_complete.date;}
| date_day
{$date = $date_day.date;}
| date_time
{$date = $date_time.date;}
;
date_complete returns [EventDate date]
@init {EventDateBuilder builder = new EventDateBuilder() ; } :
day=date_day
{builder.addDay($day.date);}
HOUR_SEP?
time=date_time
{builder.addTime($time.date);}
{$date = builder.toDate();}
;
date_day returns [EventDate date]
@init {EventDateBuilder builder = new EventDateBuilder() ; } :
(
dayOfWeek=(
MON
| TUE
| WED
| THU
| FRI
| SAT
| SUN
)?
(day=INT)=> INT
{builder.addDay($day.text);}
( m=ID
{builder.addMonth($m.text);}
year=INT ?
{builder.addMonth($year.text);}
)?
)
{$date = builder.toDate();}
;
date_time returns [EventDate date]
@init {EventDateBuilder builder = new EventDateBuilder() ; } :
TIME
{builder.addTime($TIME.text);}
{$date = builder.toDate();}
;
month : DECEMBER | JANUARY ;
MON
: 'lundi'
| 'lun'
;
TUE
: 'mardi'
| 'mar'
;
WED
: 'mercredi'
| 'mer'
;
THU
: 'jeudi'
| 'jeu'
;
FRI
: 'venredi'
| 'ven'
;
SAT
: 'samedi'
| 'sam'
;
SUN
: 'dimanche'
| 'dim'
;
DECEMBER : 'dec' | 'decembre' ;
JANUARY : 'jan' | 'janvier' ;
DATE_SEP : 'et'| ',' | '-';
HOUR_SEP : 'à' | 'a' ;
INT : ('0'..'9')+;
TIME_SEP : ':' | 'h' ;
TIME : INT TIME_SEP INT?;
ID : ('a'..'z'|'A'..'Z')+;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
** 已编辑:添加了新要求(date_day 的可选月份和年份)**