c - ANTLRv3:C 目标错误处理。更改 System.err out
问题描述
使用 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 的参考项目,所以我无法从中学习。
如果有任何帮助,我将不胜感激。
解决方案
您不能覆盖 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 代码中更改和实现的功能。
推荐阅读
- javascript - 删除 chart.js 条形图中的删除线行为
- c# - 如何将ASCII码发送到串口c#
- chart.js - 我的堆叠条形图中未使用我选择的颜色
- laravel - 来自 API 回调的 Laravel 5.8 会话丢失
- javascript - 随机存储到另一个数组后如何找到与哪个数组相关的值(例如:数组a,数组b)
- matlab - 如何找到两组 3D 点之间的仿射变换矩阵?
- python - Wor2vec 微调
- powershell - Get-ChildItem 无法找到路径,因为它不存在 - 为什么?
- mysql - mysql查询多列值的总和,其中列名来自选择列表
- javascript - 如果图像不存在,则更新 img src