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

来源:互联网 发布:罗德曼nba数据 编辑:程序博客网 时间:2024/05/17 01:57
在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++的方式编译了。