c語言是非常強大的,可以連續賦值的操作。將賦值表示式作為表示式的一種,使賦值操作不僅可以出現在賦值語句中,而且可以以表示式的形式出現在其它語句中,這是c語言靈活性的一種表現。
變數 賦值運算子 表示式
上面就是賦值表示式的組成,如下面的例子:
x = y = 2+8;
這樣的賦值表示式在lcc裡是通過函式
expr1
來實現的。
#001tree expr1(int tok)
#002;
#004
#005tree p = expr2();
#006 第
5行是處理第一表示式,比如上面的例子裡的y。
#007if (t == '='
#008 || (prec[t] >=6 && prec[t] <=8)
#009 || (prec[t] >= 11 && prec[t] <= 13))
#010
#017 else
#018
#022}
#023
#024if (tok)
#025 test(tok, stop);
#026
#027return p;
#028}
第7行是判斷右邊是否有賦值表示式,或者其它表示式。比如y = 2+8。
第13行判斷右邊是否賦值表示式,如果是賦值表示式就生成賦值樹,當然它還呼叫
expr1
來處理後面的表示式的。 第
19行和第
20行是處理復合的賦值表示式。
由於處理賦值表示式是右結合的,所以要先遞迴地計算後面的表示式再生成樹節點。
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編譯器的源程式分析 25 賦值表示式
c語言是非常強大的,可以連續賦值的操作。將賦值表示式作為表示式的一種,使賦值操作不僅可以出現在賦值語句中,而且可以以表示式的形式出現在其它語句中,這是c語言靈活性的一種表現。變數 賦值運算子 表示式 上面就是賦值表示式的組成,如下面的例子 x y 2 8 這樣的賦值表示式在lcc裡是通過函式 exp...