c - ANTLRv3 : C target error handling. 更改 System.err 输出

标签 c antlr antlr3 antlrworks

使用 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 目标中不是虚拟的),但您可以用您自己的错误处理程序替换错误处理程序以转发错误。看看我是如何做到的 old MySQL Workbench parser code .

@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 代码中更改和实现的。

关于c - ANTLRv3 : C target error handling. 更改 System.err 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993683/

相关文章:

grammar - ANTLR 3,LT!* 是什么意思?

java - 在 Java 中生成 Antlr 解析器 : Not all inputs are read

c - 为什么 UDP 组播服务器没有响应?

c - 矩阵列镜像在C中重新排列

c++ - SSL_CTX_load_verify_locations 和可信证书

java - ANTLR4 在导入时找不到语法

java - antlr 4.2.2 输出到控制台警告 (157)

c - OpenGL 模型、 View 、投影矩阵

ANTLR如何使用以相同的开头的词法分析器规则?

javascript - ANTLR,JavaScript 中可选 ';'