Я бы порекомендовал использовать ваши собственные методы для отображения семантических ошибок.Но если вам нужно остаться в ANTLR для этого:
Сначала вы должны создать свой собственный обработчик ошибок, если вы хотите создать пользовательские типы исключений.Посмотрите на оригинал antlr3baserecognizer.c: 1000.
static void
displayRecognitionErrorNew (pANTLR3_BASE_RECOGNIZER recognizer,
pANTLR3_UINT8 * tokenNames)
{
...
switch (ex->type)
{
case ANTLR3_UNWANTED_TOKEN_EXCEPTION:
...
case NUTF_EXCEPTION:
printf("Non unique token found");
break;
Затем закодируйте некоторую функцию или код правила для обработки структуры исключений.Посмотрите на antlr3baserecognizer.c: 325, чтобы настроить свое исключение.
ex = antlr3ExceptionNew(ANTLR3_RECOGNITION_EXCEPTION,
(void *)ANTLR3_RECOGNITION_EX_NAME,
NULL,
ANTLR3_FALSE);
ex->type = NUTF_EXCEPTION
ex->line = ins->getLine (ins);
ex->charPositionInLine = ins->getCharPositionInLine (ins);
ex->index = is->index (is);
ex->streamName = ins->fileName;
ex->message = "That was totally unexpected";
Далее вам нужно фактически выбросить ваше исключение при обнаружении ошибки.Я думаю, что единственный способ сделать это - переопределить mismatch (), добавив в ваш код и вызвав его из вашего правила.
static void
mismatchNew(pANTLR3_BASE_RECOGNIZER recognizer, ANTLR3_UINT32 ttype, pANTLR3_BITSET_LIST follow)
{
...
}
Наконец, скажите ANTLR использовать ваши новые функции.