2008-11-27 94 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值也是隱含的。