📄 symtable.h
字号:
#ifndef SYMTABLE_H_
#define SYMTABLE_H_
#include <string>
#include "typedef.h"
using namespace std;
extern string FuncName;
const int SHIFT = 4;
int nestlevel=0;
BucketList GlobalBucket={NULL,{NULL}};
BucketList * pSymbolTable=&GlobalBucket;
BucketList * pCurrentST=&GlobalBucket;
int hash ( string &key )
{
int temp = 0;
int i = 0;
while (i<key.length())
{
temp = ((temp << SHIFT) + key[i]) % BUCKET_SIZE;
++i;
}
return temp;
}
void st_addon(BucketList *p)
{
p->pNext=pSymbolTable;
pSymbolTable=p;
nestlevel++;
}
void st_takeoff()
{
pSymbolTable=pSymbolTable->pNext;
nestlevel--;
}
BucketList * st_new()
{
BucketList *p=new BucketList;
p->pNext=NULL;
for(int i=0;i<BUCKET_SIZE;i++) p->pRecord[i]=NULL;
return p;
}
void st_insert(string &name,Type type,SymbolType symboltype,
int location,int lineno)
{
int h=hash(name);
SymbolRecord * p=pCurrentST->pRecord[h];
if(p==NULL){
p=pCurrentST->pRecord[h]=new SymbolRecord;
}
else{
while(p->pNext!=NULL) p=p->pNext;
p->pNext=new SymbolRecord;
p=p->pNext;
}
p->location=location;
p->lineno=lineno;
p->name=name;
p->type=type;
p->symboltype=symboltype;
p->pParam=NULL;
p->paramAlloc=0;
p->localAlloc=0;
p->nestlevel=nestlevel;
p->pNext=NULL;
}
SymbolRecord * st_lookup(string &name)
{
BucketList *p= pSymbolTable;
int h=hash(name);
while(p!=NULL){
SymbolRecord * s=p->pRecord[h];
while(s!=NULL){
if(s->name==name)
return s;
s=s->pNext;
}
p=p->pNext;
}
if(!FuncName.empty())
{
SymbolRecord * s=GlobalBucket.pRecord[hash(FuncName)]->pParam;
while(s!=NULL){
if(s->name==name)
return s;
s=s->pNext;
}
}
return NULL;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -