逃脱(\)角色背后的魔力是什么?

时间:2008-11-27 10:20:00

标签: c++ c compiler-construction escaping backslash

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

4 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

有关此主题的有趣说明是On Trusting Trust [PDF link]

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

答案 2 :(得分:2)

它通常会逃避以下字符:

  • 在字符串文字或字符文字中,表示转义下一个字符。 \a表示“提醒”(闪烁终端,哔哔声等),\n表示'换行',\xNUM表示十六进制数字。
  • 如果它显示为换行符之前的最后一个可见字符,无论是否在字符串中(甚至在行范围的注释中!),它都将作为行继续符号:忽略以下换行符,并且下一行与当前行合并。

答案 3 :(得分:1)

具有以下字符的

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