[转载] LCC编译器的源程序分析(43)赋值表达式的有向无环图
来源:互联网 发布:linux rar安装 编辑:程序博客网 时间:2024/06/05 00:43
由于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的表示了。
- [转载] LCC编译器的源程序分析(43)赋值表达式的有向无环图
- [转载]LCC编译器的源程序分析(41)赋值表达式的有向无环图
- [转载]LCC编译器的源程序分析(42)赋值表达式的有向无环图
- LCC编译器的源程序分析(43)赋值表达式的有向无环图
- LCC编译器的源程序分析(41)赋值表达式的有向无环图
- LCC编译器的源程序分析(42)赋值表达式的有向无环图
- [转载]LCC编译器的源程序分析(25)赋值表达式
- [转载]LCC编译器的源程序分析(40)赋值表达式树
- LCC编译器的源程序分析(25)赋值表达式
- LCC编译器的源程序分析(40)赋值表达式树
- [转载]LCC编译器的源程序分析(22)基本表达式
- [转载]LCC编译器的源程序分析(23)一元运算表达式
- [转载]LCC编译器的源程序分析(24)条件表达式
- [转载]LCC编译器的源程序分析(26)逗号表达式
- [转载]LCC编译器的源程序分析(28)函数表达式语句
- [转载]LCC编译器的源程序分析(6)词法分析
- [转载]LCC编译器的源程序分析(7)词法分析
- [转载]LCC编译器的源程序分析(9)声明分析
- C++字符串完全指引之一 —— Win32 字符编码
- [转载]LCC编译器的源程序分析(42)赋值表达式的有向无环图
- ORACLE函数大全
- 转载: SQL Server2000 索引结构及其使用
- ASSERT和VERIFY的区别
- [转载] LCC编译器的源程序分析(43)赋值表达式的有向无环图
- asp.net ajax 开发进行时
- [转载]LCC编译器的源程序分析(44)函数名称的代码生成
- [转载]LCC编译器的源程序分析(45)函数代码入口和出口的代码生成
- [转载]LCC编译器的源程序分析(46)计算需要使用栈大小
- C++字符串完全指引之三 —— 字符串封装类续
- 文档的作用和分类
- BSD2007 制作特殊窗口!
- [转载]LCC编译器的源程序分析(47)计算需要使用栈大小