How to "skip" a rule in order to favor one rule over the other?
我目前正在使用 antlr 构建日期解析器。它需要的输入是
1 2 | year monthName numDayOfMonth era numDayOfMonth monthName year era |
这些都在
1 2 3 4 5 6 7 8 9 | 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' ; |
在我的听众中,我检查以确保
问题是,如果输入日期
有没有办法让评估者跳过这条规则,转而使用替代方法?
为什么不将年份的标记定义更改为仅包含 4 位数字?这将解决问题。
所以,你的年份和日期将是
1 2 | numYear: [0-9] [0-9] [0-9] [0-9] numDayOfMonth: [0-9] | [0-9] [0-9] |
目前,它们都具有相同的定义 - 因此解析器在解析时不知道要选择哪个规则,而是选择第一个适合输入的规则。