LCC编译器的源程序分析(64)符号表的结构注释

<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
符号表是用来保存每个符号信息的,因为编译器分析源程序的过程会生成很多符号的属性,后端根据这些属性来生成合适的指令和代码的格式。
#001// 符号表结构 .
#002//
#003// 蔡军生 2007/08/10 QQ:9073204
#004//
#005struct symbol
#006{
#007char *name; // 符号的名称 , 大多数情况是源程序的符号 .
#008int scope; // 符号作用域 .
#009Coordinate src; // 符号出现在文件中的行号和列号 .
#010Symbol up; //
#011List uses;
#012int sclass; // 符号的类型 .
#013unsigned structarg:1; // 结构参数标志 .
#014
#015unsigned addressed:1; // 地址访问的变量 .
#016unsigned computed:1; // 地址树的标志 .addrtree 函数处理 .
#017unsigned temporary:1; // 生成的临时变量标志 .
#018unsigned generated:1; // 生成的符号标志 .
#019unsigned defined:1; // 符号被定义了 , 避免声明多次 .
#020Type type; // 变量或者常量的类型 .
#021float ref; // 标号或变量的引用计数 .
#022union
#023{
#024 // 保存标号 .
#025 struct
#026 {
#027 int label; // 全局分配唯一的标号 , 这时 name 保存标号字符串 .
#028 Symbol equatedto;
#029 } l;
#030
#031 struct
#032 {
#033 unsigned cfields:1;
#034 unsigned vfields:1;
#035 Table ftab; /* omit */
#036 Field flist;
#037 } s;
#038
#039 int value;
#040 Symbol *idlist;
#041
#042 struct
#043 {
#044 Value min, max;
#045 } limits;
#046
#047 // 保存常量的结构 .
#048 struct
#049 {
#050 Value v; // 保存实际的常量值 .
#051 Symbol loc; // 指向符号表的入口 .
#052 } c;
#053
#054 struct
#055 {
#056 Coordinate pt;
#057 int label;
#058 int ncalls;
#059 Symbol *callee;
#060 } f;
#061
#062 // 全局变量或静态变量给出定义的段 .
#063 int seg;
#064
#065 Symbol alias;
#066
#067 struct
#068 {
#069 // 前端生成多次引用公共表达式的临时变量的 DAG 节点 .
#070 Node cse;
#071
#072 //
#073 int replace;
#074 Symbol next;
#075 } t;
#076
#077} u;
#078
#079Xsymbol x; // 后端使用的符号扩展。
#080};


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1737480


你可能感兴趣的:(编译器)