当前位置:首页 > 服务端 > LCC编译器的源程序分析(60)代码表的结构

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

作者:ajuanabc
来源链接:https://www.cnblogs.com/ajuanabc/archive/2007/07/27/2464323.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/125398.html

分享给朋友:

“LCC编译器的源程序分析(60)代码表的结构” 的相关文章