類型定義語句,主要是結構體(類、聯合體)的定義。
它們都是以關鍵字struct / class / union開始的。
我在scf框架裡沒有支持作用域運算符::,所以結構體的定義都是全局的,不能在結構體裡定義其他結構體類型(但可以包含其他結構體變量)。
struct S0 {
struct S0* next;
struct Data {
int x;
int y;
} d;
};
像上面這樣的結構體定義,我覺得分析起來太麻煩了[捂臉]
我認為,還是把C 的S0::Data這個類型放到全局裡定義比較好。
struct S0_Data {
int x;
int y;
};
struct S0 {
struct S0* next;
S0_Data d;
};
如果是union的話,我倒是在scf框架裡支持了結構體裡的匿名聯合體。
我設計的結構體裡是可以添加成員函數的,這點類似C 。
結構體的語法分析并不複雜,它是以struct關鍵字加上結構體名字,再加上{}擴起來的順序塊構成的,最後以分号結尾。
我沒有支持這樣的結構體定義:struct S { int x; int y; } s0;
我的打算是類型定義和變量聲明盡量分開(union除外)。
之所以對union做了跟C語言一樣的處理,是不想讓下面的代碼也要單獨定義一個全局的union類型:
struct S {
struct S* next;
union {
int i;
float f;
double d;
void* p;
};
};
init_module()函數
類型定義模塊的節點有6個:
1,class或struct關鍵字,
這兩個在scf框架裡沒有區别,因為我沒有支持public / private的權限控制。
2,類名的标志符,它是個字母或下劃線開頭的字符串。
3,左中括号,表示類成員(變量或函數)的定義開始,
4,右中括号,表示類成員(變量或函數)的定義結束。
5,分号,表示定義結束。
6,end,類定義結束之後要運行的代碼,例如計算所占的字節數。
語法編輯
語法的編輯也很簡單,隻要把這些節點按照跟源代碼一樣的順序連接起來就行。
除了union類型的成員變量之外,其他成員變量都是以類型名字開始的,所以引用了類型模塊type的入口節點。
說說怎麼計算結構體的字節數:
計算結構體的大小
CPU讀寫内存時要盡量對齊:
1,如果變量是1個字節可以從任何地址開始,
2,變量是2字節就從能被2整除的地址開始,
3,變量是4字節就從被4整除的地址開始,
4,再大的變量就從被8整除的地址開始。
如果變量的字節數不足,就對齊到最近的2的幂。
例如,3字節的變量也是以4對齊的,5字節的也是以8對齊的。
對齊之後就是變量在結構體裡的偏移量,然後加上變量的大小就可以計算出結構體的大小。
具體的語法分析函數,見下面的幾張圖,已加注釋。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!