У меня есть, на мой взгляд, простой вопрос ANTLR. У меня есть два типа токенов: ident
и special_ident
. Я хочу, чтобы мои special_ident
соответствовали одной букве, за которой следовала одна цифра. Я хочу, чтобы шаблон ident
соответствовал одной букве, за которой может следовать любое количество букв или цифр. Моя (неправильная) грамматика ниже:
expr
: special_ident
| ident
;
special_ident : LETTER DIGIT;
ident : LETTER (LETTER | DIGIT)*;
LETTER : 'A'..'Z';
DIGIT : '0'..'9';
Когда я пытаюсь проверить эту грамматику, я получаю это предупреждение:
Решение может соответствовать вводу, такому как «ЦИФРА ПИСЬМА», используя несколько альтернатив: 1, 2.
В результате альтернатива (ы) 2 были отключены для этого ввода
Я понимаю, что моя грамматика неоднозначна и что ввод, такой как A1
, может соответствовать либо ident
, либо special_ident
. Я действительно хочу, чтобы special_ident
использовался в самом узком случае.
Вот несколько примеров ввода и того, что бы я хотел, чтобы оно совпадало:
A : ident
A1 : special_ident
A1A : ident
A12 : ident
AA1 : ident
Как я могу сформировать мою грамматику так, чтобы я правильно идентифицировал мои два типа идентификаторов?