[转载]LCC编译器的源程序分析(25)赋值表达式

来源:互联网 发布:google编程挑战赛题目 编辑:程序博客网 时间:2024/05/17 22:54
C语言是非常强大的,可以连续赋值的操作。将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式的形式出现在其它语句中,这是C语言灵活性的一种表现。
变量  赋值运算符 表达式
上面就是赋值表达式的组成,如下面的例子:
x = y = 2+8;
这样的赋值表达式在LCC里是通过函数expr1来实现的。
#001 Tree expr1(int tok)
#002 {
#003  static char stop[] = { IF, ID, 0 };
#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  {
#011         int op = t;
#012         t = gettok();
#013         if (oper[op] == ASGN)
#014         {
#015               p = asgntree(ASGN, p, value(expr1(0)));
#016         }   
#017         else
#018         {
#019               expect('=');
#020               p = incr(op, p, expr1(0));
#021         }
#022  }
#023 
#024  if (tok) 
#025         test(tok, stop);
#026 
#027  return p;
#028 }
第7行是判断右边是否有赋值表达式,或者其它表达式。比如y = 2+8。
第13行判断右边是否赋值表达式,如果是赋值表达式就生成赋值树,当然它还调用expr1来处理后面的表达式的。
19行和第20行是处理复合的赋值表达式。
由于处理赋值表达式是右结合的,所以要先递归地计算后面的表达式再生成树节点。
   <script type="text/javascript"><!--google_ad_client = "pub-0904655026211899";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";google_ad_channel = "";google_color_border = "336699";google_color_bg = "FFFFFF";google_color_link = "0000FF";google_color_text = "000000";google_color_url = "008000";//--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击