6

C/C++ 编译器如何操作源代码中的转义字符["\"]?如何编写用于处理该字符的编译器语法?遇到该字符后编译器会做什么?

4

4 回答 4

14

大多数编译器分为几个部分:编译器前端称为词法分析器或扫描器。编译器的这一部分读取实际字符并创建标记。它有一个状态机,当看到转义字符时,它会决定它是真实的(例如,当它出现在字符串中时)还是修改下一个字符。标记相应地作为转义字符或其他标记(例如制表符或换行符)输出到编译器的下一部分(解析器)。状态机可以将几个字符组合成一个令牌。

于 2008-11-27T10:27:48.943 回答
6

关于这个主题的一个有趣的注释是On Trusting Trust [PDF 链接]

该论文描述了编译器可以准确处理此问题的一种方法,显示了 c-written-in-c 编译器如何没有将代码显式转换为 ASCII 值;以及如何将新的转义代码引导到编译器中,以便对新代码的 ASCII 值的理解也是隐含的。

于 2008-11-27T20:28:53.677 回答
2

它通常会转义以下字符:

  • 在字符串文字或字符文字中,它意味着转义下一个字符。\a表示“警报”(闪烁终端,哔哔声或其他),\n表示“换行”,\xNUM例如表示十六进制数。
  • 如果它作为换行符之前的最后一个可见字符出现,无论是否在字符串中(甚至在行宽注释中!),它都充当换行符:以下换行符被忽略,下一行是与当前行合并。
于 2008-11-27T11:06:20.533 回答
1

带有后续字符(如\n)的转义字符是 C 编译器的单个字符 - 扫描器将其作为字符标记呈现给解析器,因此解析器中不需要特殊的语法规则来处理转义字符。

于 2008-11-27T10:50:05.433 回答