LCC编译器的源程序分析(43)赋值表达式的有向无环图

本文详细解析了编译器中如何将源代码语句转换为DAG表示形式,重点介绍了处理变量和常量表达式的步骤。对于变量,文章解释了如何检查其属性并将其添加到局部变量列表中;对于常量,则展示了如何根据不同情况生成相应的DAG节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于INDIR树与ADDRL树的类型相同,所以已经转换为ADDRL树,直接对ADDRL树进行进访问了,下面就是在函数listnodes里处理赋值表达式的ADDRL树,它的代码如下:
#412  case ADDRL:
#413         {
#414               assert(tlab == 0 && flab == 0);
#415               if (tp->u.sym->generated)
#416                    addlocal(tp->u.sym);
#417 
#418               p = node(tp->op + sizeop(voidptype->size), NULL, NULL, tp->u.sym);
#419         }
#420         break;
415行判断是否生成的变量,如果是就需要添加到局变量里。
418行是创建DAG节点。
 
接着下来就处理常量表达式树,并把它转换为DAG节点,它的代码如下:
#101  case CNST: 
#102         {
#103               Type ty = unqual(tp->type);
#104               assert(ty->u.sym);
#105 
#106               if (tlab || flab)
#107               {
#108                    assert(ty == inttype);
#109                    if (tlab && tp->u.v.i != 0)
#110                          list(jump(tlab));
#111                    else if (flab && tp->u.v.i == 0)
#112                          list(jump(flab));
#113               }
#114               else if (ty->u.sym->addressed)
#115                    p = listnodes(cvtconst(tp), 0, 0);
#116               else
#117                    p = node(op, NULL, NULL, constant(ty, tp->u.v));
#118         }
#119         break;
103行是获取树的类型。
106行是判断是否条件判断树。
114行判断这个符号是否地址常量类型。
117行生成常量的DAG节点。
 
通过这面几节的分析,就把一个语句(int nTest1 = 1;)变换到DAG的表示了。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值