我目前正在使用antlr构建日期解析器。所需的输入是
year monthName numDayOfMonth era
numDayOfMonth monthName year era
这些都在stringDate
规则下,所以我的语法看起来像这样
stringDate: year monthName numDayOfMonth
| numDayOfMonth monthName year;
numYear: NUMBER ;
strMonth: MONTH ;
numDayOfMonth: NUMBER ;
NUMBER: [0-9]+ ;
MONTH: 'jan' | 'feb' | 'mar' | 'apr' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' ;
在我的听众中,我检查以确保numDayOfMonth
在[1, 31]
范围内,以确保该数字是有效日期。几个月我都这样做(首先我将它们转换为相应的月份)。
问题是,如果输入日期2013 June 13
,则日期将被正确解析。但是,当我输入13 June 2013
时,它会被错误地解析,因为解析器感到困惑并且认为2013是一天而不是一年,因此在exitNumDayOfMonth
期间检查失败。我一直在摸索如何处理这个问题。我本质上是希望评估者跳过遇到num > 31
的规则,但是我不确定如何跳过规则。我尝试过return
并抛出错误,但似乎没有任何效果。
是否有一种方法可以使评估者跳过此规则,转而使用替代方法?
答案 0 :(得分:2)
为什么不将Year的令牌定义更改为仅包含4位数字?这样可以解决问题。
因此,您的年份和日期将是
extract(p, xy)
# point.ID poly.ID ID_1 NAME_1 ID_2 NAME_2 AREA
#1 1 1 1 Diekirch 1 Clervaux 312
#2 2 2 1 Diekirch 2 Diekirch 218
#3 3 3 1 Diekirch 3 Redange 259
#4 4 4 1 Diekirch 4 Vianden 76
#5 5 5 1 Diekirch 5 Wiltz 263
#6 6 6 2 Grevenmacher 6 Echternach 188
#7 7 7 2 Grevenmacher 7 Remich 129
#8 8 8 2 Grevenmacher 12 Grevenmacher 210
#9 9 9 3 Luxembourg 8 Capellen 185
#10 10 10 3 Luxembourg 9 Esch-sur-Alzette 251
#11 11 11 3 Luxembourg 10 Luxembourg 237
#12 12 12 3 Luxembourg 11 Mersch 233
当前,它们都有相同的定义-因此解析器不知道在解析时要选择哪个规则,而是与适合输入的第一个规则一起使用。