ANTLRv3: C целевая обработка ошибок. Изменение System.err out - PullRequest
1 голос
/ 11 июля 2019

Используя ANTLRv3, я могу создать свой синтаксический анализатор, который по умолчанию печатает строку ошибки в System.err, как правило, на консоли.

Однако у меня есть другой вывод для вывода ошибок, например, в файл(для регистрации), т.е. я не работаю на консоли.Мне было интересно, что я должен сделать, чтобы напечатать строку ошибки в этом случае?Я думаю, мне просто нужно изменить определение функции, которая отвечает за печать строки ошибки, но я не могу найти ее.

Из этой документации https://theantlrguy.atlassian.net/wiki/spaces/ANTLR3/pages/2687258/Error+reporting+and+recovery Я могу найти, что я простоМне нужно переопределить emitErrorMessage(), но я не могу найти его в моей цели C, поэтому я немного запутался, как это будет работать.

Я работаю над целью ANTLR 3.5.2 C.Использование ANTLRv4 не вариант.

К сожалению, я не могу найти много справочных проектов, использующих C, поэтому не могу учиться у них.

Буду признателен за любую помощь.

1 Ответ

3 голосов
/ 12 июля 2019

Вы не можете переопределить функцию C (поскольку она не является виртуальной в цели C), но вы можете заменить обработчик ошибок своим собственным, чтобы вместо этого получать сообщения об ошибках.Посмотрите, как я это сделал в старом коде синтаксического анализатора MySQL Workbench .

@parser::postinclude {
#ifdef __cplusplus
extern "C" { 
#endif

  // Custom error reporting function.
  void onMySQLParseError(struct ANTLR3_BASE_RECOGNIZER_struct *recognizer, pANTLR3_UINT8 *tokenNames); 

#ifdef __cplusplus
};
#endif
}

@parser::members {
}

@parser::apifuncs
{
 // Install custom error collector for the front end.
 RECOGNIZER->displayRecognitionError = onMySQLParseError;
}

Функция onMySQLParseError - это, очевидно, то, что вы должны изменить и реализовать в своем коде C.

...