【发布时间】:2016-11-30 01:04:35
【问题描述】:
我想在 ANTLR4 中构建一个自然语言日期解析器,但一直在忽略“噪音”输入。下面的简化语法解析包含格式为 DATE MONTH 的有效日期的任何字符串:
dates
: simple_date dates
| EOF
;
simple_date
: DATE MONTH
;
DATE : [0-9][0-9]?;
MONTH : January | February | March // etc.;
将接受诸如“1 January 22 February”之类的文本。我希望语法也接受其他文本,所以我在末尾添加了ANY : . -> skip;:
dates
: simple_date dates
| EOF
;
simple_date
: DATE MONTH
;
DATE : [0-9][0-9]?;
MONTH : January | February | March // etc.;
ANY : . -> skip;
然而,这并不完全符合我的要求。虽然接受了诸如“1 月 1 日和 2 月 22 日”之类的字符串并且 simple_date 规则匹配了两次,但字符串“1 月 1XX 日”也将匹配该规则。
问题:我如何构建一个语法,其中规则仅与 exact 标记序列匹配,而忽略所有其他输入,包括未在任何规则中定义的顺序的标记?考虑以下情况:
"From 1 January to 2 February" -> simple_date matches "1 January" and "2 February"
"From 1XX January to 2 February" -> simple_date matches "2 February", rest is ignored
"From January to February" -> no match, everything ignored
【问题讨论】:
-
你需要发布一个有效的语法。你的语法如何匹配“1 January 22 February”?有些规则应该使用 + 或 * 运算符,但未显示。
-
抱歉,语法中有错字 - 我已将顶级规则中的
date更改为dates以使其按所述工作。