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

📄 symboltable.cpp

📁 编译原理课程设计,语法分析.学校的课程设计,好象还有点用吧
💻 CPP
字号:
#include "Symboltable.h"
#include "string.h"

Symbol_table::Symbol_table()
{
}

Symbol_table::~Symbol_table()
{
}

//在Symbol_table中查找元素,返回它所在的行,若找不到则返回-1
int Symbol_table::find(char* ca)
{
	vector<symbol>::iterator iter;
	for(iter=vSymbol_table.begin();iter!=vSymbol_table.end();iter++)
	{
		if(judge(iter->cVarname,ca))
			return (iter-vSymbol_table.begin());
	}
	return -1;
}

//在Index产生一个新块,返回Index中元素的个数
int Symbol_table::newblock()
{
	vIndex.push_back(vSymbol_table.end()-vSymbol_table.begin());
	return (vIndex.end()-vIndex.begin());
}

//判断两个字符串(以0结束)是否相等
bool Symbol_table::judge(char* ca,char* cb)
{
	int i=0;
	while(i<leng)
	{
		if((*(ca+i)!=0)&&(*(cb+i)!=0))
		{
			if(*(ca+i)==*(cb+i))
				i++;
		    else
				return false;
		}
		else if(*(ca+i)==*(cb+i))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

//在Symbol_table中查找元素,返回它所在的行,若找不到则将该元素插入Symbol_table中,并返回插入的行
int Symbol_table::insert(char* ca)
{
	vector<symbol>::iterator iter;
	if(strcmp(ca,"")) //非临时变量若存在返回以前的位置,否则直接插入
	{
		for(iter=vSymbol_table.begin();iter!=vSymbol_table.end();iter++)
		{
			if(judge(iter->cVarname,ca))
				return (iter-vSymbol_table.begin());
		}
	}
	symbol sElement;
	strcpy(sElement.cVarname,ca);
	sElement.iAddress=-1;
	sElement.iType=-1;
	sElement.iDimension=-1;
	vSymbol_table.push_back(sElement);
	return (vSymbol_table.end()-vSymbol_table.begin()-1);
}

//重定位函数,返回重定位后Symbol_table中元素的个数
int Symbol_table::reset()
{
	int i=*(vIndex.end()-1);
	vIndex.pop_back();
	vSymbol_table.erase(vSymbol_table.begin()+i,vSymbol_table.end());
	return (vSymbol_table.end()-vSymbol_table.begin());
}

//设置Symbol_table某行的地址,成功返回0,不成功返回-2
int Symbol_table::setAddress(int irow,int ia)
{
	if(irow<(vSymbol_table.end()-vSymbol_table.begin()))
	{
		vector<symbol>::iterator iter=vSymbol_table.begin();
	    iter+=irow;
	    iter->iAddress=ia;
		return 0;
	}
	else
		return -2;
}

//设置Symbol_table某行的类型,成功返回0,不成功返回-2
int Symbol_table::setType(int irow,int ia)
{
	if(irow<(vSymbol_table.end()-vSymbol_table.begin()))
	{
		vector<symbol>::iterator iter=vSymbol_table.begin();
	    iter+=irow;
	    iter->iType=ia;
		return 0;
	}
	else
		return -2;
}

//设置Symbol_table某行的维数,成功返回0,不成功返回-2
int Symbol_table::setDimension(int irow,int ia)
{
	if(irow<(vSymbol_table.end()-vSymbol_table.begin()))
	{
		vector<symbol>::iterator iter=vSymbol_table.begin();
	    iter+=irow;
	    iter->iDimension=ia;
		return 0;
	}
	else
		return -2;
}

//设置Symbol_table某行的参数,成功返回0,不成功返回-2,一次设置一个参数
int Symbol_table::setParam(int irow,int ia)
{
	if(irow<(vSymbol_table.end()-vSymbol_table.begin()))
	{
		vector<symbol>::iterator iter=vSymbol_table.begin();
	    iter+=irow;
	    iter->vParam.push_back(ia);
		return 0;
	}
	else
		return -2;
}

int Symbol_table::getParam(int irow,int ia)
{
	return vSymbol_table[irow].vParam[ia];
}
//得到Symbol_table某行的地址,成功返回该地址,不成功返回-2
int Symbol_table::getAddress(int irow)
{
	if(irow<(vSymbol_table.end()-vSymbol_table.begin()))
	{
		vector<symbol>::iterator iter=vSymbol_table.begin();
	    iter+=irow;
		return iter->iAddress;
	}
	else
		return -2;
}

//得到Symbol_table某行的类型,成功返回该类型,不成功返回-2
int Symbol_table::getType(int irow)
{
	if(irow<(vSymbol_table.end()-vSymbol_table.begin()))
	{
		vector<symbol>::iterator iter=vSymbol_table.begin();
	    iter+=irow;
		return iter->iType;
	}
	else
		return -2;
}

//得到Symbol_table某行的维数,成功返回该维数,不成功返回-2
int Symbol_table::getDimension(int irow)
{
	if(irow<(vSymbol_table.end()-vSymbol_table.begin()))
	{
		vector<symbol>::iterator iter=vSymbol_table.begin();
	    iter+=irow;
		return iter->iDimension;
	}
	else
		return -2;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -