Вы пытаетесь решить эту проблему не на том уровне. Он не должен обрабатываться на уровне грамматики, но на следующем семантическом этапе (который используется для поиска логических / семантических ошибок, а не синтаксических ошибок, с которыми имеет дело ваш синтаксический анализатор). Вы можете увидеть тот же подход в грамматике C . Правило statement
ссылается на правило jumpStatement
, которое в свою очередь соответствует (среди прочего) оператору возврата.
Обработка таких семантических ошибок также позволяет улучшить сообщения об ошибках. Вместо «no viable alt» вы можете вывести ошибку, которая гласит «возврат разрешен только в теле функции» или аналогичный. Для этого проверьте сгенерированное дерево синтаксического анализа, найдите операторы return и проверьте родительский контекст (ы) этого поддерева, чтобы узнать, является ли оно действительным или нет.