2008-11-27 66 views
5

C/C++编译器如何处理源代码中的转义字符[“\”]?如何编写用于处理该字符的编译器语法?编译器在遇到该字符后会做什么?逃逸背后的魔力()字符

+0

至少试着拼写你创建的标签正确... – Gilles 2008-11-27 10:22:10

+0

对不起,这个问题是匆忙输入的 – mahesh 2008-11-27 10:27:39

+0

你的问题中缺少这个字符(?)。 虽然有什么问题? – 2008-11-27 10:31:36

回答

14

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

1

具有以下字符的转义字符(如\n)是C编译器的单个字符 - 扫描器将其作为字符标记呈现给解析器,因此在解析器中不需要特殊的语法规则以用于转义字符。

2

它一般逸出以下字符:

  • 在一个字符串或字符文字,则意味着逸出的下一个字符。 \a表示'提醒'(闪烁终端,哔哔声或其他),\n表示'换行',\xNUM表示例如一个十六进制数字。
  • 如果它作为换行符之前的最后一个可见字符出现,无论是否在一个字符串中(甚至在一行全注释中!),它将作为一行续行:以下换行符被忽略,并且下一行与当前行合并。
5

关于这个问题的一个有趣的笔记是On Trusting Trust [PDF link]

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