ANTLR4: анализировать номер как идентификатор вместо цифр c литерал - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть такая ситуация, когда нужно рассматривать целое число как идентификатор.
Основной синтаксис языка (к сожалению) позволяет это.

Грамматический отрывок:

grammar Alang;

...

NLITERAL   : [0-9]+ ;
...
IDENTIFIER : [a-zA-Z0-9_]+ ;

Пример кода, с которым нужно иметь дело:

/** declaration block **/

Method 465;
...

В приведенном выше примере кода, поскольку необходимо поместить NLITERAL до IDENTIFIER парсер выбирает 465 как NLITERAL.

Какой хороший способ справиться с такими ситуациями?
(В идеале, избегая кода приложения в грамматике, чтобы сохранить его во время выполнения c)

Я нашел похожие вопросы на ТАК, не совсем полезно, хотя.

1 Ответ

3 голосов
/ 20 апреля 2020

Нет хорошего способа заставить 465 создать токен NLITERAL или токен IDENTIFIER в зависимости от контекста (вы можете использовать режимы лексера, но это, вероятно, не подходит для ваших нужд).

Что вы можете сделать довольно легко, так это разрешить NLITERAL s в дополнение к IDENTIFIERS в определенных местах. Таким образом, вы можете определить правило синтаксического анализатора

methodName: IDENTIFIER | NLITERAL;

и затем использовать это правило вместо IDENTIFIER там, где это необходимо.

...