Antlr4 - Как мне сообщить о семантической ошибке от посетителя - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть грамматика, которую я хочу использовать для целей Java и C ++.Таким образом, я не могу использовать какие-либо семантические предикаты в грамматике, так как это исключает независимость целевого языка.

У меня есть что-то вроде -

expr : SOME_FUNCTION '(' INT, INT ')'

Теперь мне нужно добавить чек, например INT > 2.Как вывести ошибку из visitExpr(), если это условие не выполняется?Я вижу, что у лексера / парсера есть слушатели ошибок, но нет посетителя.

1 Ответ

0 голосов
/ 21 декабря 2018

Прослушиватели ошибок используются для сообщения об ошибках.По умолчанию есть консольный слушатель, который печатает только ошибки на консоли.Это происходит во время синтаксического (синтаксического) этапа.Добавив собственный прослушиватель ошибок, вы можете собрать информацию об ошибках в структуру приложения для последующей обработки.

Семантическая фаза, на которой вы проверяете дерево разбора для определения логических ошибок, наступает после синтаксической фазы.Но, тем не менее, вы можете использовать упомянутую структуру информации об ошибках, чтобы получать больше ошибок при посещении дерева разбора.Не нужно бросать исключения или что-то в этом роде.Все, что вы делаете, это собираете больше ошибок и сохраняете их напрямую.

После того, как оба этапа завершены, вы можете использовать структуру ошибок для визуализации всех ошибок (красное подчеркивание в редакторе, отображение на панели ошибок и т. Д..).

...