LCC編譯器的源程式分析 18 19

2021-04-13 02:00:42 字數 1855 閱讀 1560

lcc編譯器的源程式分析(19)全域性函式的定義

函式定義funcdefn處理裡,已經準備好呼叫引數和引數返回,接著就是呼叫全域性函式宣告來處理。如下面的**:

#132  //宣告函式。

#133  cfunc = dclglobal(sclass, id, ty, &pt);

#134

上面的**是處理函式全域性定義。

現在就去就分析dclglobal函式的實現,它主要用來分析全域性函式的。它的**如下:

#001 //全域性函式宣告。

#002 static symbol dclglobal(int sclass, char *id, type ty, coordinate *pos)

#003

#014

第6行到第13行是處理儲存型別。

#015     p = lookup(id, identifiers);

#016     if (p && p->scope == global)

#017    

#032

第15行是查詢這個全域性函式是否已經宣告,如果已經宣告就儲存在p變數裡。

第16行到第31行是找到這個全域性函式已經宣告後,就開始判斷這個宣告是否合法。這裡也是進行很複雜的型別推斷的,由於在例子裡的簡單型別是沒有使用到,先把它們放下。

#033     if (p == null || p->scope != global)

#034    

#044          else

#045         

#052

在第33行裡,如果發現找到這個函式已經宣告過,就會執行到條件語句裡面。

第35行是查詢這個函式是否已經在外面宣告過,也就是使用external定義的函式。

第36行到第42行是找到這個函式已經在外面定義過,那麼只需要重新找到原來的函式定義處理就行了。

第45行到第50行是處理本函式從沒有定義過,因而就把它儲存到全域性函式宣告表裡,然後呼叫後端生成函式ir->defsymbol來建立本函式的名稱。比如在na**的後端生成**裡是生成$main名稱。

#053          if (p->sclass != static)

#054         

第53行到第59行是統計全域性函式定義的個數。

#060     }

#061     else if (p->sclass == extern)

#062          p->sclass = sclass;

#063

第61行是處理這個函式定義外面定義的。

#064     p->type = ty;

#065     p->src = *pos;

#066     if (t == '=' && isfunc(p->type))

#067    

#072     else if (t == '=')

#073    

#080     }

#081     else if (p->sclass == static && !isfunc(p->type)

#082          && p->type->size == 0)

#083          error("undefined size for `%t %s'/n", p->type, p->name);

#084     return p;

#085 }

上面這段**是處理函式初始化。

在第84行裡返回這個函式屬性符號。

通過上面的處理,就已經把乙個全域性函式儲存到全域性函式**globals,並且生成這個函式在生成**裡的函式名稱$main。當然也進行了函式是否重複定義的處理。

LCC編譯器的源程式分析 12 13

語法分析是比較複雜的處理,下面再來分析乙個例子,它的 如下 typedef unsigned short wchar t typedef wchar t wint t 第一句語句在lcc裡的處理,前面已經解釋清楚,主要生成wchar t儲存符號表裡,並且記錄這個id的型別屬性。那麼第二句是怎麼樣通過...

LCC編譯器的源程式分析 20 復合語句

在 c語言裡,有一種語句叫做復合語句。它是由 把一些語句括起來的,如下面的例子 在lcc 裡處理這樣的復合語句的函式是 compound 它在上面函式定義函式 funcdefn 是這樣呼叫的 150labels table null,labels 151stmtlabs table null,lab...

LCC編譯器的源程式分析 37 default語句

default 語句是使用在 switch 語句的復合語句裡,它是所有其它分支不能處理時的分支處理。在 lcc裡是如下處理的 001case default 002 if swp null 003 error illegal default label n 004 else if swp defla...