首页 > 解决方案 > ANTLR4 空格问题,将数字与字母分开

问题描述

我有一个语法,应该区分 ID、INT 和 IP 地址。我的语法有更多要识别的模式,但我正在努力解决的是像“123abc”这样的标记。

通常,语法会定义 WS: [ \t\r\n]+ -> skip; 这将忽略空格,因此在我的语法输入中,如“123abc”将变为“123”和“abc”。这是词法分析器的正确行为。但是,我希望在这种情况下解析失败。

我在 SO 和其他一些网站上看到过类似的问题。我想出了一个可行的解决方案(如下),但在我看来应该有更好的方法。我想知道是否有人可以提出这样的方法。

这是我的(简化的)工作语法:

grammar Simple;

query: exp SP EOF;
exp: exp SP exp | term;
term: (name | sint) | name SP? '=' range_vals;
range_vals: SP? range_val SP? '..' SP? range_val;
sint: MINUS? INT;
range_val: (name | sint);
name: NAME;

MINUS: '-';
NAME: ALFA (ALFA_NUM)+;
fragment ALFA_NUM: ALFA | [0-9];
fragment ALFA: [a-z] | [A-Z];
INT: [0-9]+;

SP: ' '+;
WS: [\t\r\n]+ -> skip;
SL_COMMENT: '//' .*? '\n' -> skip;

标签: antlr4grammar

解决方案


如果123abc产生一个INT令牌和一个NAME令牌,那么就没有办法允许123 abc,但123abc同时也忽略空格。但是你可以做的是让它产生一个单一的令牌非法令牌,就像这样(把它放在 and 的定义之后NAMEINT所以这些将优先于有效的名称和数字):

ILLEGAL_NAME: ALFA_NUM+;

现在123 abc会给你一个INT和一个NAME令牌,而123abc会给你一个ILLEGAL_NAME令牌,这将导致解析器出错,因为没有匹配它。


推荐阅读