编译原理 符号表的代码实现


//----------------------------符号表---------------------------------------
//预定义
struct snode;
struct stable;
//符号表结点
struct snode
{
 string text;  //符号名称
 string type;  //符号类型
 union {int ival;double rval;}value;  //值------------
 int offset;   //偏移量
 snode *nextn;  //指向下一个节点
 stable *header;  //指向下属符号表的表头
};
//符号表表头
struct stable
{
 stable *previous; //指向先前创建的符号表表头
 snode *firstnode; //指向第一个结点
 stable *ifnoelements;//如果此表为空,则用它指向下一个表头
};
 
//当前表头
stable *currtab;
//建立新表,返回表头指针
//参数:当前的节点的表头
stable *mktable(stable *previous)
{
 stable *newtable =new stable;
 newtable->previous=previous;
 newtable->ifnoelements=0;
 newtable->firstnode=0;
 if(previous->firstnode==0)
 {
  previous->ifnoelements=newtable;
 }
 else
 {
  snode* ininode=previous->firstnode;
  while(ininode->nextn!=0)
  {
   ininode=ininode->nextn;
  }
  ininode->header=newtable;
 }
 
 currtab=newtable;
 return newtable;
}
//在node指向的符号表中为text建立一个新表项,返回新建立的结点
//参数:node为当前的节点的表头,text名称,type类型,offset偏移
snode *enter(stable *table,string text,string type,int offset,double value)
{
 
  
  //创建节点
  snode *newnode = new snode;
  newnode->text=text;
  newnode->type=type;
  newnode->offset=offset;
  newnode->nextn=0;
  newnode->header=0;
  if(type=="int")
  {
   newnode->value.ival=value;
  }
  else if(type=="real")
  {
   newnode->value.rval=value;
  }
  
  //判断此表是否无元素
  if(currtab->firstnode==0)
  {
   currtab->firstnode=newnode;
   currtab->ifnoelements=0;
  }
  else
  {
   snode* addnode=currtab->firstnode;
   while(addnode->nextn!=0)
   {
    addnode=addnode->nextn;
   }
   addnode->nextn=newnode;
  }
  
  return newnode;
}
//初始化符号表,返回表头节点
void inittab()
{
 stable *initable = new stable;
 initable->firstnode=0;
 initable->previous=0;
 initable->ifnoelements=0;
 currtab=initable;
}
//查找指针,表示结果
snode *searchresult;
//查找变量,返回指向该变量的指针
//查找变量,返回指向该变量的指针
snode* search(string name)
{
 //检查表是否空
 bool isempty=true;
 stable* checktab=currtab;
 if(checktab->firstnode!=0)
 {isempty=false;}
 while(checktab->previous!=0)
 {
  if(checktab->firstnode!=0)
  {isempty=false;}
  checktab=checktab->previous;
 }
 if(checktab->firstnode!=0)
 {isempty=false;}
 if(isempty)
 {
  return 0;
 }
 snode* lastnode;
 if(currtab->firstnode==0)
 {
  //移到非空的表头
  stable* notnullhead=currtab;
  while(notnullhead->firstnode==0)
  {
   notnullhead=notnullhead->previous;
  }
  snode* tmpnode=notnullhead->firstnode;
  //移到最后的元素
  while(tmpnode->nextn!=0)
  {
   tmpnode=tmpnode->nextn;
  }
  lastnode=tmpnode;
 }
 else
 {
  lastnode=currtab->firstnode;
  while(lastnode->nextn!=0)
  {
   lastnode=lastnode->nextn;
  }
 }
 //移到表头
 stable* fronttab=currtab;
 while(fronttab->previous!=0)
 {
  fronttab=fronttab->previous;
 }
 snode* nownode=0;
 while(nownode!=lastnode)
 {
  while(fronttab->ifnoelements!=0)
  {
   fronttab=fronttab->ifnoelements;
  }
  nownode=fronttab->firstnode;
  while(nownode->nextn!=0)
  {
   if(nownode->text==name)
   {
    searchresult=nownode;
    return searchresult;
   }
   nownode=nownode->nextn;
  }
  if(nownode->text==name)
  {
   searchresult=nownode;
   return searchresult;
  }
  fronttab=nownode->header;
 }
 if(nownode->text==name)
 {
  searchresult=nownode;
  return searchresult;
 }
return 0;
}
 
//消毁符号表
void delNode()
{
//more codes here......
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM