LCC編譯器的源程式分析 14 結構型別的宣告

2021-04-13 01:27:44 字數 1912 閱讀 3726

以前都是簡單型別的識別和語法分析,現在來分析結構的宣告,它是比較複雜的一種資料型別,但結構在編寫程式中使用是非常多的。由於程式的方程式就是:

資料結構+演算法

=程式現在物件導向的方程式是:

資料結構+演算法

=物件 物件

+物件=程式

由上面的公式,就可以看出程式中的資料結構是非常重要的,無論是物件導向的程式設計,還是面向過程的程式設計,有什麼樣的資料結構,就需要有什麼樣演算法。而在

c語言裡,使用結構型別來描述現實中需要的抽象模型。例子裡的結構宣告如下:

struct _iobuf ;

typedef struct _iobuf file;

這是宣告乙個檔案物件結構。現在就來分析一下

lcc編譯器是怎麼樣進行結構的語法分析的。先用調函式

decl(dclglobal)

,然後呼叫函式

specifier

,在函式

specifier

就會處理結構的宣告,它的**如下:

#001 static void decl(symbol (*dcl)(int, char *, type, coordinate *))

#002 

#016  else

#017         tag = "";

#018 

#019  //

結構的定義開始。

#020  if (t == ';

#023         ty = newstruct(op, tag);

#024         ty->u.sym->src = pos;

#025         ty->u.sym->defined = 1;

#026 

#027         t = gettok();

#028         if (istypename(t, tsym))

#029            

#033         else

#034            

#037 

#038         test('}', stop);

#039  }

#040  else if (*tag && (p = lookup(tag, types)) != null

#041         && p->type->op == op)

#042  

#047  else

#048  

#053 

#054  if (*tag && xref)

#055         use(ty->u.sym, pos);

#056 

#057  return ty;

#058 } 處理

struct

之後,接著就要處理結構的名稱,在這個例子裡是

_iobuf

,它是在第

9行裡獲取到這個記號,然後在第

11行裡儲存

_iobuf

到變數tag

裡。tag

也有可能是空的情況,比如像下面的語法:

typedef struct   a;

上面的語法就是在第

17行裡處理這種情況的。 在第

20行到

39行裡,主要處理結構字段定義。像結構

_iobuf

中的定義,就是處理下面的語句:

在第23

行裡建立結構的型別

ty,然後在第

28行裡判斷語句是否型別開始的記號,如果不是就是出錯的定義。如果是型別,比如像例子裡的

char

,就需要呼叫函式

fields(ty)

來處理所有的字段定義。

接著下來就需要去分析

fields

的**,下一次再帶你去分析它吧。

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