編譯器處理轉義符?

請問各位,究竟如何判斷一個字元串內是否有轉義字元呢?(本人用C++寫了一句

if(a[i] == "\") cout &<&< "yes";

似乎行不通·· )

如果是讀取不了的話?編譯器的詞法分析又是如何處理轉義字元的呢?


題主沒有表達清楚是要正向還是逆向處理轉義字元。

正向:把兩個字元 n 識別為一個轉義字元 new line

逆向:把一個字元 new line 識別為一個需要轉義的字元,輸出兩個字元 n

假設是正向:

題主莫非是用這樣的代碼來測試的?

string a = "test line 1
test line 2
test line 3";
for (int i = 0; i &< a.length(); i++) { if (a[i] == "\") cout &<&< "yes" &<&< endl; }

這樣當然找不到任何轉義字元,因為在在源碼里的
字面量(兩個字元)都已經被編譯器正向處理過一次變成了new line(一個LF字元),所以a里已經沒有任何""字元了。

但測試不應該這麼測。如果我們要寫一個編譯器,它通常要從源碼文件讀入原始文本。如果源碼文件里出現了這樣的字元串:

test line 1
test line 2
test line 3

那我們要在一個小測試程序里模擬這個輸入的話,應該寫:

"test line 1\ntest line 2\ntest line 3"

這樣得到的字元串才跟源碼文件里的原始文本一致。其實就是人肉逆向處理一次來對抗編譯器做的那一次正向處理。

然後該怎麼做題主應該能自己弄清楚了。

假設是逆向:

總共只有那麼多個字元需要轉義。查語言規範把所有需要轉義的字元放進一個表裡匹配一下就好。


一個轉義符是一個字元,所以你不能通過檢測的存在來檢測轉義符的存在
你可以檢查ascii碼,那幾個需要轉義的符號的ascii碼是確定的


推薦閱讀:

Android上ARM本地庫是如何運行在其他CPU架構上的?
Linux/Unix中查看一個C/C++大工程中所有函數的調用順序,有哪些方法?
編譯器的自舉原理是什麼?
從哪裡可以得到包含了Python3所支持的所有語法的測試用例?

TAG:C編程語言 | C | 編譯原理 | 編譯器 |