我想在ANTLR4中构建一个自然语言日期解析器,并且无视忽略"噪声"输入。下面的简化语法以DATE MONTH:
格式解析包含有效日期的任何字符串listolists[x][0] < math.floor(listolists[x][0])
文字如&#34; 1月22日2月和#34;将被接受。我希望语法也接受其他文本,所以我在最后添加了dates
: simple_date dates
| EOF
;
simple_date
: DATE MONTH
;
DATE : [0-9][0-9]?;
MONTH : January | February | March // etc.;
:
ANY : . -> skip;
然而,这并不是我想做的事。字符串如&#34; 1月1日和2月22日&#34;接受,dates
: simple_date dates
| EOF
;
simple_date
: DATE MONTH
;
DATE : [0-9][0-9]?;
MONTH : January | February | March // etc.;
ANY : . -> skip;
规则匹配两次,字符串&#34; 1XX 1月和#34;也将符合规则。
问题:如何构建语法,其中规则仅与精确标记序列匹配,同时忽略所有其他输入,包括未按任何规则定义的顺序的标记?请考虑以下情况:
simple_date
答案 0 :(得分:0)
不要掉落额外的&#34;噪音&#34;在词法分析器中,例如你的任何规则。 Lexer不知道当前令牌在什么情况下。你想要的是&#34;当它不是DATE MONTH&#34;形式时丢弃一些噪音令牌。将您的ANY规则移动到与噪声匹配的解析器规则。
此外,建议在LEXER中放置空白区域。但在这种情况下,您的ANY规则应排除那些与WS规则匹配的规则。另请注意您的DATE规则拦截了[0-9] [0-9]格式的噪音令牌?
dates
: (noise* (simple_date) noise*)+
;
simple_date
: DATE MONTH
;
noise: (DATE|ANY);
DATE : [0-9][0-9]?;
MONTH : 'January' | 'February' | 'March' ;
ANY : ~(' '|'\t' | '\f')+ ;
WS : [ \t\f]+ -> skip;
接受:
1 January and 22 February noise 33
1 January and 22 February 3
拒绝:
1xx January
这还没有经过全面测试。你的MONTH词法分析器规则也拦截了一个独立的月份文字(例如1月),这被视为噪音,但在我的语法中没有处理,例如
22 February January