📄 symboltable.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 + -