ANTLR4空格问题,将数字与字母分开

ANTLR4空格问题,将数字与字母分开,antlr4,grammar,Antlr4,Grammar,我有一个语法,它应该区分ID、INT和IP地址。我的语法有更多的模式需要识别,但我正在努力解决的是像“123abc”这样的标记 通常语法会定义WS:[\t\r\n]+->skip;它会忽略空格,所以在我的语法输入中,像'123abc'会变成'123'和'abc'。这是lexer的正确行为。但是,我希望在这种情况下解析失败 我在SO和其他一些网站上也看到过类似的问题。我提出了一个可行的解决方案(如下),但在我看来,应该有更好的办法。我想知道是否有人能提出这样的建议 以下是我的(简化)工作语法: g

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

通常语法会定义WS:[\t\r\n]+->skip;它会忽略空格,所以在我的语法输入中,像'123abc'会变成'123'和'abc'。这是lexer的正确行为。但是,我希望在这种情况下解析失败

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

如果
123abc
生成
INT
标记和
NAME
标记,则无法允许
123 abc
,但不允许
123abc
,同时忽略空格。但是,您可以做的是让它生成一个单独的非法令牌,如下所示(将其放在
NAME
INT
的定义之后,以便有效的名称和数字优先考虑):


现在,
123abc
将为您提供一个
INT
和一个
NAME
标记,而
123abc
将为您提供一个
非法的\u NAME
标记,这将导致解析器出错,因为没有匹配的标记。

当前的行为是什么?您希望解析器在输入
123abc
时失败,所以我假设它没有失败?那么它为那个输入生成了什么样的解析树呢?好的,我刚刚尝试了一下,得到了“第1:3行无关的输入'abc'和SP”。这不是你想要的吗?@sepp2k。是的,这就是我想要的。但我的实际语法包含了更多的东西,我不喜欢有这么多SP?到处都是。我希望有另一个更优雅的解决方案(也许是lexer模式?)。啊,对不起,我误解了你的问题。
ILLEGAL_NAME: ALFA_NUM+;