Сбой в декларации с возвратом в первом правиле парсера в грамматике ANTLR4

Я использую возвращает для моих правил парсера, который работает для всех правил парсера, кроме первого. Если первое правило парсера в моем грамматике использует декларацию возвращает, ANTLR4 жалуется следующим образом:

ожидание ARG_ACTION при сопоставлении правила

Если я добавлю еще одно правило анализатора, выше которого не используется "возврат", ANTLR не жалуется.

Здесь у вас есть грамматика, сведенная к проблеме:

grammar FirstParserRuleReturnIssue;
ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
aRule returns [String s]: ID { $s = $ID.text; };

Я искал особую роль первого правила, которое могло бы объяснить поведение, но ничего не найдено. Это ошибка? Мне не хватает понимания?

Ответ 1

Вам нужно поместить правила парсера (начинайте с строчной буквы) перед лексирными правилами (начинайте с заглавной буквы) в своей грамматике. После того, как вы встретите правило lexer, [ запускает LEXER_CHAR_SET вместо ARG_ACTION, поэтому поток токенов, видимый компилятором, выглядит так: вы передаете набор символов, где должно быть возвращаемое значение.