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