⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symtable.h

📁 一个简单的C语言子集的编译器,一个简单的C语言子集的编译器
💻 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 + -