使用ANTLRv3,我可以构建解析器,该解析器默认情况下通常在控制台上将错误字符串打印到System.err。
但是,我有不同的输出可将错误打印到例如文件(用于日志记录)中,即我不在控制台上工作。我想知道在这种情况下该如何打印错误字符串?我想我只需要更改负责打印错误字符串的函数的定义,但找不到它。
从本文档https://theantlrguy.atlassian.net/wiki/spaces/ANTLR3/pages/2687258/Error+reporting+and+recovery中我可以发现我只需要覆盖cl2000
,但是我无法在我的C目标中找到它,所以我有点困惑它的工作方式。
我正在研究ANTLR 3.5.2 C目标。不能使用ANTLRv4。
不幸的是,我找不到很多使用C的参考项目,所以我无法向他们学习。
感谢您的帮助。
答案 0 :(得分:3)
您不能覆盖C函数(因为它在C目标中不是虚拟的),但是您可以用自己的错误处理程序替换错误处理程序,以转发错误。在https://stackoverflow.com/a/57002571/139985中了解我的操作方式。
@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代码中更改和实现的功能。