zl程序教程

您现在的位置是:首页 >  工具

当前栏目

LCC编译器的源程序分析(24)条件表达式

编译器 分析 条件 表达式 24 源程序 LCC
2023-09-14 09:10:39 时间
 
C语言里条件表达式语句如下:
表达式1 ?表达式2 :表达式3
条件运算符要求有三个操作对象,称为三元运算符,它是C语言中唯一的一个三目运算符。比如计算两个值的最大值,就可以写成下面这样:
int nMax = a > b ? a:b;
下面就来看LCC是怎么样处理条件表达式的,它的代码如下:
 
#001 static Tree expr2(void)
#002 {
#003      Tree p = expr3(4);
#004 
第3行里是先处理表达式1(a > b),它是调用expr3函数来实现的,然后返回表达式树p。
 
#005      if (t == '?')
#006      {
#007           Tree l, r;
#008           Coordinate pts[2];
#009           if (Aflag > 1 && isfunc(p->type))
#010                 warning("%s used in a conditional expression/n",
#011                 funcname(p));
#012 
#013           p = pointer(p);
#014           t = gettok();
#015           pts[0] = src;
#016            l = pointer(expr(':'));
#017           pts[1] = src;
#018           r = pointer(expr2());
#019 
#020           if (generic(p->op) != CNST && events.points)
#021           {
#022                 apply(events.points, &pts[0], &l);
#023                 apply(events.points, &pts[1], &r);
#024           }
#025 
#026           p = condtree(p, l, r);
#027      }
#028 
#029      return p;
#030 }
第5行是判断这个表达式是否条件表达式。
第16行是递归调用expr函数来处理表达式2(a:),然后返回左子树l。
第18行是递归调用expr2处理表达式3(b),然后返回右子树r。
第26行是构造条件树节点。
通过上面短短 30 行程序就可以处理条件表达式了。