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