• 大小: 15KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: 其他
  • 标签: 符号表  编译原理  

资源简介

符号表设计与实现 编译原理 湖南大学

资源截图

代码片段和文件信息

#include 
#include 
#include 

using namespace std;

const int MaxSize=1000000;
const int MaxP=999983;
const int SHIFT=2;
const string Td[8]={“常量““变量““数组““结构体““文件““标号““指针““函数“};
const string Ad[6]={“整型““实型““字符型““布尔型““枚举型““void“};

class Tag {
public:
Tag(){}
Tag(string name){
     Name = name;
     cout<<“\n请输入标识符的种类:“<     cout<<“1.常量\t2.变量\t3.数组\t4.结构体\n5.文件\t6.标号\t7.指针\t8.函数“<     cin>>Type;
     cout<<“\n请输入标识符的属性:“<     cout<<“1.整型\t2.实型\t3.字符型\t4.布尔型\n5.枚举型\t6.void“<     cin>>Attr;
     cout<<“\n请输入标识符的地址:“;
     cin>>Addr;
     if ( Type==3 )
     {
          cout<<“\n请输入数组的维数:“;
          cin>>Dim;
          Numd = new int[Dim];
          cout<<“请依次输入个维元素个数:“;
          for ( int i=0;i>Numd[i];
     }
     else {
          Numd = new(int);
          Dim = Numd[0] = 1;
     }
     cout<    }
Tag(string nameint typeint attrvoid* addrint dim=1int* numd=NULL)
{
Name = name;
Type = type;
Attr = attr;
Addr = addr;
Dim = dim;
Numd = new int[Dim];
if ( Dim>1 )
            for ( int i=0;i        else  Numd[0] = 1;
}
string Name; //标识符的名字
int TypeAttrScopDim; //标识符的类型,属性,作用域,维数
//?作用域如何记录?
void* Addr; //标识符的地址
int* Numd; //各维元素个数
};

Tag* TagHash[MaxSize];

unsigned int APHash(string s)
{
    unsigned int ret=0;
    for ( int i=0;i    {
        if ( i&1 )  ret ^= (~((ret<<11)^s[i]^(ret>>5)));
        else  ret ^= ((ret<<7)^s[i]^(ret>>3));
    }
    return ret%MaxP;
}

void InsertTag(Tag* T)
{
int p=APHash(T->Name);
while ( TagHash[p]!=NULL )  p = (p+1)%MaxSize;
TagHash[p] = T;
}

int SearchTag(string Name)
{
int p=APHash(Name);
while ( TagHash[p]!=NULL && (TagHash[p]->Name)!=Name )  p = (p+1)%MaxSize;
if ( TagHash[p]==NULL )  return -1;
else  return p;
}

void DeleteTag(string Name)
{
int p=SearchTag(Name);
if ( p!=-1 )
{
delete TagHash[p];
TagHash[p] = NULL;
cout<<“删除成功“< }
else  cout<<“标识符未找到“<}

void PrintTag()
{
    cout<<“\n打印表:“< cout<<“名字\t种类\t属性\t地址“< for ( int i=0;i  if ( TagHash[i]!=NULL )
 {
 cout<Name<<“\t“<Type-1]<<“\t“
 <Attr-1]<<“\t“<Addr<  }
cout<}

bool ShowSelTab()
{
cout<<“请选择符号表操作:“< cout<<“1.插入标识符\t2.查找标识符\t3.删除标识符“< cout<<“4.打印全部标识符信息\t0.退出“< int opt;
cin>>opt;
if ( opt==0 )  return false;
if ( opt==4 )
{
         PrintTag();return true;
    }
cout<<“\n请输入标识符的名字:“;
string Name;
cin>>Name;
int p;
Tag* T;
switch (opt)
{
case 1:T=new Tag(Name);InsertTag(T);break;
case 2:p=SearchTag(Name);
if ( p!=-1 )
{
cout<<“名字\t种类\t属性\t地址“< cout<Name<<“\t“<Type-1]<<“\t“
<Attr-1]<<“\t“<

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2013-05-12 22:38  符号表设计与实现\
     文件        3910  2012-04-09 20:56  符号表设计与实现\main.cpp
     文件        1892  2012-03-31 19:31  符号表设计与实现\OptTag.h
     文件        1446  2012-04-09 12:23  符号表设计与实现\Tag.h
     文件       50688  2012-05-21 14:09  编译原理实验指导书.doc

评论

共有 条评论