编译器运行时错误报告和错误位置

Compiler run-time error reporting with location of error

本文关键字:错误 位置 报告 运行时错误 编译器      更新时间:2023-10-16

我正在用c++ (Ubuntu 12.04)编写一个编译器。gcc)。到目前为止,具有相当精确的行数和列数的累积错误/警告报告错误/警告位置工作得很好。

我的项目目标包括简单地学习如何做到这一点,所以我添加了一个预处理阶段(在第一步只做最小的事情,如字符串连接,注释删除等),创建一个结果tmp文件。此时不需要这样做,因为我可以在解析时在词法分析器中连接字符串,而且词法分析器已经很好地处理了注释,但是我想了解如何尽可能高效地处理它。

编译时的错误并不难:
(1)错误检查(->报告编译时错误)
(2)如果没有错误,预处理-> TMP文件
(3)在TMP文件上运行解析器等(这是编译时无错误的)

然而,我也报告运行时错误与行号(例如,对于数组越界检查与整数表达式边界的数组)。当只解析tmp文件时,错误检查将被添加到我的IR的字节码中,并且该文件可能与源文件有很大的不同(特别是如果我们开始允许粘贴头文件),那么您究竟如何合理地报告有用的错误位置?是否有一个标准的技巧,比如gcc如何处理这个问题?提到的绑定支票类型当然不会发生在C;但是运行时错误报告适用于,比如说,c++中层次结构中指针的动态解析,并且gcc可以很好地获取行号。

你可以在你的预处理器生成的临时文件中记录行号信息,比如cpp的line Control。

C预处理器通知C编译器源代码中每个标记的来源位置。目前,这只是文件名和行号。