【问题标题】:What's the Magic Behind Escape(\) CharacterEscape(\) 字符背后的魔力是什么
【发布时间】:2010-09-24 07:36:24
【问题描述】:

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

【问题讨论】:

  • 至少尝试正确拼写您创建的标签...
  • 抱歉,问题是匆忙输入的
  • 您的问题中缺少此字符 (?)。不过有什么急事?
  • 突然出现紧急会议分钟回复问题,因此输入喜欢。感谢修改:)
  • 有人愿意评论为什么这个问题被推倒了吗?有什么我想念的吗?对我来说,这似乎是一个公平和正确的问题。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      一般会转义以下字符:

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

      【讨论】:

      • 不要忘记 C99 中的 \uXXXX 和 \UXXXXXXXX。
      • \NNN(其中 N 是数字 0-7)表示八进制的字节数。 \0,通常称为 Null-Terminator,实际上与 \000 相同。我认为 255 是 \377
      • 亚伦,没错。 \ 还有其他用途。我想我会列出最重要的(通过主观测量)。
      【解决方案4】:

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

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

      【讨论】:

      • 那是一篇非常有趣的论文,我好久没读了。我忘记了有关引导编译器以理解新的转义字符序列(例如 '\v')的部分 - 所以我没有立即看到它的相关性。我很高兴我检查了它。
      猜你喜欢
      • 2012-05-15
      • 2012-11-30
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多