2013-04-22 1 views
0

Я пытаюсь улучшить сообщения об ошибках antlr и замечает, что синтаксические предикаты кажутся корнем сообщений о плохих ошибках.Улучшить сообщения об ошибках синтаксического предиката?

Это я сейчас работаю. Вот пример структуры грамматики. Извините, что я не могу предоставить фактическую грамматику. Надеюсь, это иллюстрирует это.

defs 
: (a) => a | b 
; 


a 
: A B c 
; 

//b is actually much further down the chain and due to ordering can't be moved up. 
b 
: A c 
; 

Проблема в том, что, например, если у вас есть жетоны «A B D». Сообщение об ошибке, которое вы получаете, указано в правиле 'b'. Я хочу, чтобы сообщение об ошибке было из правила 'a'. Значение, если «A B» соответствует, тогда я хочу ошибку, если «c» не сопоставляется.

Я думал, может быть, вы могли бы сделать это

a 
: (A B) => A B c | {EmitErrorMessage("error");} 
; 

ответ

1

Вы должны расслабить синтаксический предикат в defs вместо прибавления к a.

defs 
    : (A B) => a 
    | b 
    ; 

Это приведет к анализатору, чтобы выбрать первый вариант и введите a правило на основе всего двух символов A B.

+0

Да, я мог бы поклясться, что пробовал это раньше, и это не сработало. Хотя я просто попробовал это сейчас, и он работает. Благодаря! – Will

Смежные вопросы