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

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 行是处理复合的赋值表达式。
由于处理赋值表达式是右结合的,所以要先递归地计算后面的表达式再生成树节点。
 

你可能感兴趣的:(c,tree,语言,编译器)