我正在C編寫一個編譯器,需要獲取源代碼文件中定義的字符的ASCII值。對於普通字母這很簡單,但有什麼辦法將字符串「\ n」轉換爲C中'\ n'的ASCII碼(需要處理所有字符)?如何將字符串轉換爲C中的字符
歡呼聲
我正在C編寫一個編譯器,需要獲取源代碼文件中定義的字符的ASCII值。對於普通字母這很簡單,但有什麼辦法將字符串「\ n」轉換爲C中'\ n'的ASCII碼(需要處理所有字符)?如何將字符串轉換爲C中的字符
歡呼聲
我正在寫一個編譯器使用C
可能不是一個好主意,做所有原C.這是更好的使用像野牛的東西來處理初步分析是。
也就是說,處理\*
轉義的最佳方法就是查找每個轉義轉換成的表。
您將需要編寫自己的解析器/轉換器。轉義序列列表可以在許多地方在線找到。解析C風格的語法是非常困難的,因此您可能還希望查看現有的免費實現,例如Clang。
如果字符串是一個字符,你可以建立索引:
char *s = "\n";
int ascii = s[0];
但是,如果你的系統中使用的字符集不是ASCII上,上面不會給你一個ASCII值。如果你需要確保你的代碼運行在這樣罕見的機器上,你可以建立一個ASCII表並使用它。
如果在另一方面,你有兩個字符,即
char *s = "\\n";
那麼你可以做這樣的事情:
char c;
c = s[0];
if (c == '\\') {
c = s[1]; /* assume s is long enough */
switch (c) {
case 'n': return '\n'; break;
case 't': return '\t'; break;
...
default: return c;
}
}
上述假設您目前的編譯器知道什麼'\n'
手段。如果沒有,那麼你仍然可以做到。爲了找到如何去做,以及一個引人入勝的故事,請參閱Ken Thompson的Reflections on Trusting Trust。
我收集他實際上有字符串「\\ n」,他想轉換... – Tronic 2010-02-24 02:07:51
是的,這個問題並不清楚,但我已經更新了我的答案,以涵蓋這種情況。謝謝! – 2010-02-24 02:09:56
你將需要自己實現這個。原因是你在做什麼取決於你正在編譯的語言的字符串文字語法! (您的編譯器在C中實現的事實並不重要。)
對於跨越多種語言的字符串文本,存在常規轉義序列;例如\n
通常表示ASCII NewLine字符。但是,這並不意味着這些約定適合您正在編譯的語言。
Boost.Spirit Qi或Lex也可能是解析複雜語言的好選擇。 – Tronic 2010-02-24 02:19:31