LCC編譯器的源程式分析 25 賦值表示式

2021-06-15 21:36:14 字數 894 閱讀 1664

c語言是非常強大的,可以連續賦值的操作。將賦值表示式作為表示式的一種,使賦值操作不僅可以出現在賦值語句中,而且可以以表示式的形式出現在其它語句中,這是c語言靈活性的一種表現。

變數  賦值運算子 表示式

上面就是賦值表示式的組成,如下面的例子:

x = y = 2+8;

這樣的賦值表示式在lcc裡是通過函式

expr1

來實現的。

#001 tree expr1(int tok)

#002 ;

#004 

#005  tree p = expr2();

#006  第

5行是處理第一表示式,比如上面的例子裡的y。

#007  if (t == '='

#008         || (prec[t] >= 6 && prec[t] <= 8)

#009         || (prec[t] >= 11 && prec[t] <= 13))

#010     

#017         else

#018        

#022  }

#023 

#024  if (tok) 

#025         test(tok, stop);

#026 

#027  return 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...