Ловля ошибок в ANTLR и поиск родителя - PullRequest
1 голос
/ 07 января 2011

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

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

И введите ему «abc def».

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

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

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

1 Ответ

2 голосов
/ 07 января 2011

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; } } * +1010 *

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

...