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

代码片段和文件信息
#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
- 上一篇:IPFS白皮书中文版
- 下一篇:操作系统进程管理实验报告
相关资源
-
编译原理实验工具及参考源码(lex&
-
类pascal语言编译器(编译原理实验)
-
编译原理课程设计:词法语法编译器
-
中科院 编译原理 习题及解答
-
编译原理四元式和逆波兰式
-
《编译原理》清华大学版中的pl0扩充
-
PL/0功能扩充break功能
-
编译原理LR(0)语法分析
-
编译原理中间代码生成程序
-
编译原理:LR分析程序
-
编译原理实验:词法分析,语法分析
-
windows7 x86符号表part05)
-
吉林大学编译原理课件
-
编译原理龙书答案
-
编译原理 第三章课后习题答案
-
易语言变量和数组的编译原理
-
编译原理语法分析器、词法分析器
-
山东大学编译原理PL/0语言 compiler实验
-
FOR循环语句的翻译程序设计简单优先
-
NFA的确定化NFA->DFA完整可运行代码
-
哈工大威海编译原理实验报告和源代
-
哈工大威海-编译原理实验报告和源码
-
编译原理课设c编译器
-
赋值语句翻译四元式
-
河北工业大学编译原理实验代码及实
-
编译原理课程设计 while do循环语句翻
-
编译原理课程设计do——while简单优先
-
南开大学编译原理课件及作业
-
华工往年编译原理试卷
-
编译原理课程设计for循环LR法三元式
评论
共有 条评论