while
語句的語義是這樣定義的:
while(
表示式) 語句1
當表示式為非
0值時執行
while
語句中的內嵌語句
1。其特點就是先判斷表示式的值,然後再執行語句。
lcc是通過下面的**來處理這個語句的:
#015 case while:
#016 whilestmt(genlabel(3), swp, lev + 1);
#017 break;
上面第16行語句裡,第乙個引數
genlabel(3)
是指while
語句使用三個標號。第二引數
swp是指明是否在
switch
語句裡。第三個引數是指明遞迴呼叫次數。
然後呼叫函式
whilestmt
處理。
#001 static void whilestmt(int lab, swtch swp, int lev)
#002 第
12行是處理標號
2分支。 第
13行是定義標號1。
第14行是處理語句1。
第15行是定義標號2.
第16行是定義執行點。 第
17行是對條件表示式生成
dag**。 第
18行是判斷是否需要生成標號3。
while
語句最終生成的彙編**有下面的形式:
跳轉到標號2
標號1:語句1
標號2:如果
條件表示式不等於
0 就跳轉到標號1執行
標號3:
上面的標號
3是為了方便裡面有跳轉語句跳出迴圈體的,比如使用
goto
、break
、return
等等,就需跳到標號
3執行。
LCC編譯器的源程式分析 12 13
語法分析是比較複雜的處理,下面再來分析乙個例子,它的 如下 typedef unsigned short wchar t typedef wchar t wint t 第一句語句在lcc裡的處理,前面已經解釋清楚,主要生成wchar t儲存符號表裡,並且記錄這個id的型別屬性。那麼第二句是怎麼樣通過...
LCC編譯器的源程式分析 18 19
lcc編譯器的源程式分析 19 全域性函式的定義 函式定義funcdefn處理裡,已經準備好呼叫引數和引數返回,接著就是呼叫全域性函式宣告來處理。如下面的 132 宣告函式。133 cfunc dclglobal sclass,id,ty,pt 134 上面的 是處理函式全域性定義。現在就去就分析d...
LCC編譯器的源程式分析 20 復合語句
在 c語言裡,有一種語句叫做復合語句。它是由 把一些語句括起來的,如下面的例子 在lcc 裡處理這樣的復合語句的函式是 compound 它在上面函式定義函式 funcdefn 是這樣呼叫的 150labels table null,labels 151stmtlabs table null,lab...