以前都是簡單型別的識別和語法分析,現在來分析結構的宣告,它是比較複雜的一種資料型別,但結構在編寫程式中使用是非常多的。由於程式的方程式就是:
資料結構+演算法
=程式現在物件導向的方程式是:
資料結構+演算法
=物件 物件
+物件=程式
由上面的公式,就可以看出程式中的資料結構是非常重要的,無論是物件導向的程式設計,還是面向過程的程式設計,有什麼樣的資料結構,就需要有什麼樣演算法。而在
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...