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

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License