忽略"噪音"在ANTLR4中

时间:2016-11-30 01:04:35

标签: parsing grammar antlr4

我想在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

1 个答案:

答案 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