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++的方式编译了。

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License