c / c ++编译器如何知道错误在哪一行

时间:2014-02-04 14:25:59

标签: c++ c parsing

对此可能有一个非常明显的答案,但我想知道编译器如何知道我的错误所在的代码行。在某些情况下,它甚至知道该列。

我能想到的唯一方法是将输入字符串标记为2D数组。这将存储[lines] [tokens]。

C / C ++可以被标记为1个长1D数组,这可能更有效。我想知道通常的解析方法会保留行信息。

2 个答案:

答案 0 :(得分:6)

其实大部分内容都在the dragon book中介绍。 编译器执行Lexing / Parsing,即:将源代码转换为树形表示。 这样做时,每个关键字变量等都与行号和列号相关联。

但是在解析过程中,失败的确切来源可能会丢失,信息可能会关闭。

答案 1 :(得分:3)

这是漫长而复杂的“工程编译器”或Compilers Theory

的第一步

简短的回答是:有一个名为“前端”的模块,通常需要处理多个阶段:

  1. 扫描
  2. 解析
  3. 红外发生器
  4. IR优化工具......
  5. 结构不固定,因此每个编译器都有自己的一组模块,但前端处理中涉及的步骤或多或少

    扫描 - 将字符流映射为单词(也忽略空白/评论)或标记

    解析 - 这是发生语法和(某些)语义分析以及报告语法错误的地方

    为了解决这个问题:编译器知道你的错误的位置,因为什么东西不适合称为“抽象语法树”的结构(即它不能被构造)或者不遵循任何语法-directed翻译规则,嗯..有一些错误,编译器指出没有发生这种情况的位置。如果只有一个单词/令牌存在语法错误,那么即使是精确的列位置也可以返回,因为没有匹配终端关键字:基本令牌,如 if 关键字C / C ++语言。

    如果您想了解有关此主题的更多信息,我的建议是从"Compiler Book" or "Dragon Book"的经典学术方法开始,然后,稍后可能会研究像Clang这样的开源前端。