У меня есть грамматика, которая должна различать идентификаторы, INT и IP-адреса. В моей грамматике есть больше шаблонов для распознавания, но я борюсь с такими токенами, как «123ab c».
Обычно грамматика определяет WS: [\ t \ r \ n] + -> skip; который будет игнорировать пробелы, поэтому в моем грамматическом вводе, например, «123ab c» станет «123» и «ab c». Это правильное поведение лексера. Однако я хочу, чтобы в этой ситуации синтаксический анализ не удался.
Я видел похожие вопросы в 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;