Поймать ошибки в 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; } }
а затем добавьте ловит в правилах, где вы хотите поймать.