LCC编译器的源程序分析(60)代码表的结构

在LCC里使用代码表来表示代码块,前端把所有代码属性放到代码表里,后端根据代码表来生成代码,它的结构如下:
#001 //代码表结构定义.
#002 //蔡军生 2007/07/27
#003 struct code
#004 {
#005      //代码表的类型.
#006      enum KindType
#007      {
#008           Blockbeg, //块的开始.
#009           Blockend, //块的结束.
#010           Local, //局部变量.
#011           Address, //
#012           Defpoint, //定义点,断点可设置的地方.
#013           Label,   // 标号代码块.
#014           Start,   //代码表入口.
#015           Gen,   //
#016           Jump, //跳转. 
#017           Switch //生成SWITCH语句.
#018      } kind;
#019 
#020      Code prev, next;
#021      union
#022      {
#023           struct
#024           {
#025                 int level;
#026                 Symbol *locals;
#027                 Table identifiers, types;
#028                 Env x;
#029           } block;
#030 
#031           Code begin;
#032           Symbol var;
#033 
#034           struct
#035           {
#036                 Symbol sym;
#037                 Symbol base;
#038                 long offset;
#039           } addr;
#040 
#041           struct
#042           {
#043                 Coordinate src;
#044                 int point;
#045           } point;
#046 
#047           Node forest;
#048           struct
#049           {
#050                 Symbol sym;
#051                 Symbol table;
#052                 Symbol deflab;
#053                 int size;
#054                 long *values;
#055                 Symbol *labels;
#056           } swtch;
#057 
#058      } u;
#059 };
 
然后通过两个全局指针保存代码表的头和尾,这样就可以很方便地操作代码表了。这两个指针如下:
#001 //创建代码的入口.
#002 struct code codehead = { code::Start };
#003 
#004 //指向代码表尾的指针.
#005 Code codelist = &codehead;
 
最后通过函数 AppendCode 不断地添加到代码表里,它的代码如下:
#001 //
#002 // 添加块代码到代码表 .
#003 // 蔡军生  2007/07/27
#004 //
#005 Code AppendCode(code::KindType kind)
#006 {
#007  Code cp;
#008 
#009  if (!reachable(kind))
#010  {
#011         warning("unreachable code/n");
#012  }   
#013 
#014  //NEW(cp, FUNC);
#015  cp = (Code)allocate(sizeof(*cp),0);
#016  memset(cp,0,sizeof(*cp));
#017 
#018  // 代码块的类型 .
#019  cp->kind = kind;
#020 
#021  // 指向前一个代码块 .
#022  cp->prev = codelist;
#023 
#024  // 标志最后一块 .
#025  cp->next = NULL;
#026 
#027  // 加入到代码双向链表
#028  codelist->next = cp;
#029 
#030  // 修改 codelist 指向最后一块 .
#031  codelist = cp;
#032 
#033  return cp;
#034 }
 
这里的代码跟 LCC 的代码已经有点不一样,因为我在不断地修改这份代码,到现在已经完全改为 C ++的方式编译了。
 

你可能感兴趣的:(c,struct,table,null,编译器,Types)