編譯原理 符號表的代碼實現


//----------------------------符號表---------------------------------------
//預定義
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