LCC編譯器的源程式分析 33 break語句

2021-08-22 09:16:46 字數 1023 閱讀 9515

break

語句可以使用流程跳出

switch

語句的分支選擇,當然它還可以用來從迴圈體內跳出迴圈體,即提前結束迴圈,接著執行迴圈下面的語句。但它不能用於迴圈語句和

switch

語句之外的其它語句中。

比如下面的例子:

for(;;)

現在就來分析一下面處理

break

的**:

#001case break:

#002 walk(null, 0, 0);

#003 definept(null);

#004

#005 if (swp && swp->lab > loop)

#006 branch(swp->lab + 1);

#007 else if (loop)

#008 branch(loop + 2);

#009 else

#010 error("illegal break statement/n");

#011

#012 t = gettok();

#013 expect(';');

#014 break; 第

2行復位分配的記憶體。 第

3行定義了執行點。 第

5行判斷是

switch

語句和其它迴圈語句的區分。如果是

switch

語句就要生成

swp->lab + 1

的跳轉目標的標號(第

6行)。如果是迴圈語句就要生成

loop + 2

的跳轉目標的標號,也就是以前介紹過的標號

3的位置,那樣就達到跳出迴圈的目的(第

8行)。 第

10行是當

break

在其它語句裡就出錯的情況處理。 第

12行是獲取下乙個記號。 第

13行是希望以分號結束

break

語句。

這樣就處理完成

break

語句的語義和語法的分析

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