LCC編譯器的源程式分析 30 while迴圈語句

2021-04-13 02:34:40 字數 1134 閱讀 8656

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...