編譯器字元識別
『壹』 編譯器 如何識別源程序是c或c++
源代碼是由字元組成的吧?
明白這一點就好辦了
編譯器首先將你寫的代碼讀入內存,然後尋找代碼中的關鍵字、標識符等信息,建立一個所謂的符號表,根據這個符號表對你的源代碼進行檢查,檢查的依據正是該語言的語法和句法規則。比如是否有變數重復定義錯誤、是否有類型不兼容錯誤,是否有遺漏語句分隔符錯誤等等。這些都是比較簡單的,例如根據語言的關鍵字表可以檢查是否有非法的關鍵字(語句分隔符之後的下一個有效字元一定是一個關鍵字或已定義的標識符,因此很容易識別並挑出其中的關鍵字進行檢查),其它檢查也是類似的。
檢查沒有問題後,編譯器開始鏈接和映射操作(該過程在檢查階段也有使用),將你的源程序翻譯成匯編程序或其它中間程序。這一步是最復雜的,因為句法和語法比較簡單,但整個程序的邏輯卻復雜的多,而且編譯器還要負責在不改變代碼原意的前提下將代碼盡可能地進行優化。
最後就是將生成的匯編代碼翻譯為機器語言,這一步是最簡單的,因為匯編只是將機器語言簡單符號化而已,現在的編譯理論已經能夠確保將匯編代碼准確地翻譯為機器碼了。
以上。
另外,站長團上有產品團購,便宜有保證
『貳』 c與c++語言編譯器是如何識別關鍵字
根據編譯器的不同,有不同的識別方式,例如VC6.0使用系統內建關鍵字列表,如果用戶定義變數的時候使用了系統默認的關鍵字,則會在編譯的時候產生錯誤。
附上:
C語言的關鍵字共有32個,根據關鍵字的作用,可分其為數據類型關鍵字、控制語句關鍵字、存儲類型關鍵字和其它關鍵字四類。
1 數據類型關鍵字(12個):
(1) char :聲明字元型變數或函數
(2) double :聲明雙精度變數或函數
(3) enum :聲明枚舉類型
(4) float:聲明浮點型變數或函數
(5) int: 聲明整型變數或函數
(6) long :聲明長整型變數或函數
(7) short :聲明短整型變數或函數
(8) signed:聲明有符號類型變數或函數
(9) struct:聲明結構體變數或函數
(10) union:聲明聯合數據類型
(11) unsigned:聲明無符號類型變數或函數
(12) void :聲明函數無返回值或無參數,聲明無類型指針(基本上就這三個作用)
(2)控制語句關鍵字(12個):
A循環語句
(1) for:一種循環語句(可意會不可言傳)
(2) do :循環語句的循環體
(3) while :循環語句的循環條件
(4) break:跳出當前循環
(5) continue:結束當前循環,開始下一輪循環
B條件語句
(1)if: 條件語句
(2)else :條件語句否定分支(與 if 連用)
(3)goto:無條件跳轉語句
C開關語句
(1)switch :用於開關語句
(2)case:開關語句分支
(3)default:開關語句中的「其他」分支
D
return :子程序返回語句(可以帶參數,也看不帶參數)
3 存儲類型關鍵字(4個)
(1)auto :聲明自動變數 一般不使用
(2)extern:聲明變數是在其他文件正聲明(也可以看做是引用變數)
(3)register:聲明積存器變數
(4)static :聲明靜態變數
4 其它關鍵字(4個):
(1)const :聲明只讀變數
(2)sizeof:計算數據類型長度
(3)typedef:用以給數據類型取別名(當然還有其他作用
(4)volatile:說明變數在程序執行中可被隱含地改變
『叄』 編譯器怎麼區分標識符和字元
首先要清楚標識符和字元的定義
標識符是程序員自己規定的具有特定含義的單詞,比如類名稱,屬性名稱,變數名等。
舉例子就是
class
string
字元是指計算機中使用的字母、數字、字和符號
舉例子就是
1,2,3,abc
然後要強調,編譯宴蠢器是無法區分標識符和字元的,只有人事先為其規定好規則的情況下,編譯器才會按照標識符的方式去讀取。打個比方,我規定了class為類標識符,那當我程序里
出現了class
test時,編譯器就會認為test是類而不是字元。不知道含臘能不能理解談祥滑,不過是個好問題
『肆』 在C語言中編譯器是如何讀取字元的
回車也是一個字元,你的問題描述的不是很清除,看來三遍還沒沒能完全理解,你是scanf("%d",&n);之後在while(getchar()!='\n')處停住但是程序是直接過去的是吧。
實際上呢,我們電腦上的回車鍵其實是兩個鍵值:回車換行也就是\r\n,在輸入字元串之後\n不一定被系統接受而被滯留在輸入流裡面,所以在後面想要再獲得字元時正好輸入緩存里有就直接接收了。所以就沒等你再輸入回車就執行玩了,在獲得一個字元之前通常的做法是先清除緩存再獲得,記得是fflush()這個函數。當然清除緩存的方法有很多不局限於此!
『伍』 編譯器如何識別字元是關鍵字還是變數名的
編譯過程大概分這么幾步
首先用有限狀態自動機把代碼文本分割成一個一個的token,每個token是一個意義單位,
比如
int main(123);
就被分割成了
int
main
(
123
)
然後對token列表根據該語言的語法建立語法樹,在建立語法樹的過程中就要區分某個單詞是關鍵字還是標識符(也就是變數名),一般來講編譯器一般都有一個保留字列表,開始的時候都當作變數名看待,如果發現某個變數名出現在了保留字列表裡,就對其進行標識處理。
『陸』 為什麼codeblocks識別不出轉義字元
codeblocks識別不出轉義字元原因:codeblocks 默認是用的g++編譯器。應該是默認的編碼問題。
原因code blocks默認UTF-8(無bom)字元編碼。而GCC是按照ANSI字元編碼來編譯的。所以會出現中文亂碼。解決方法是把code blocks設置成ANSI字元編碼。操作是新建--在界面的右半邊把字元編碼選擇ANSI保存。
字元型常量:
C語言中字元型常量所表示的值是int型所能包含的值。我們可以用ASCII表達式來表示一個字元型常量,或者用單引號內加反斜杠表示轉義字元。
'A', 'x2f', '