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