Поймать ошибки в ANTLR и найти родителя

Я обнаружил, что могу перехватывать ошибки во время синтаксического анализа, перезаписывая displayRecognitionError, но как мне найти родительский "узел" этой ошибки?

ех. если у меня есть грамматика: prog: stat expr; стат: STRING; expr: INTEGER;

И дать ему ввод "abc def".

Тогда я получу ошибку в "def", которая должна быть целым числом. В этот момент я хочу получить родителя, который является "expr" (так как он терпит неудачу внутри части INTEGER), и его родительский "прога". Вроде как печать трассировки стека в Java.

Я попытался посмотреть на узел из RecognitionException, проанализированный в displayRecognitionError, но он имеет значение null, а с помощью CommonErrorNode родительский элемент имеет значение null.

Должен ли я быть совершенно другим подходом?

1 ответ

Решение

CommonTree имеет:

/** Who is the parent node of this node; if null, implies node is root */
public CommonTree parent;

Это то что ты хочешь?

О, вы хотите родительское правило. Я бы сказал, использовать исключения, чтобы ловить ошибки, где вы хотите. добавить исключение перехват в правиле, где вы хотите перехватывать ошибки expr, а затем отключить перехват по умолчанию для других правил.

использование

@rulecatch { catch (RecognitionException re) { throw re; } }

а затем добавьте ловит в правилах, где вы хотите поймать.

Другие вопросы по тегам