资源简介
符号表设计与实现 编译原理 湖南大学
代码片段和文件信息
#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白皮书中文版
- 下一篇:操作系统进程管理实验报告
相关资源
-
2014-20152编译原理-期末B卷.docx
-
NFA确定化与DFA最小化
-
算术表达式翻译成对应的后缀表达式
-
编译原理学习大全,详解
-
广工编译原理实验报告+可执行程序
-
[典例]编译原理学习笔记·文法的构造
-
广东工业大学编译原理实验报告PL0语
-
编译器的设计与实现 编译原理课程设
-
编译原理 华保健
-
编译原理课程设计完整
-
NFA转换成DFA——编译原理
-
LL1文法的判别以及非LL1文法的转换完
-
Chomsky文法类型判断编译原理实验完整
-
山东大学编译原理2017试题
-
编译原理答案陈文宇、王晓斌
-
编译原理作业-表达式编译器
-
编译原理1题库完整版含答案
-
Tiger语言语法手册
-
程序设计语言编译原理第三版课后习
-
编译原理课程设计 南京航空航天大学
-
编译原理算符优先文法实验源码
-
哈工大 编译原理作业
-
编译原理C-编译器源代码_min
-
编译原理.rar
-
南京理工大学编译原理复习题
-
编译原理课程设计:基于表达式的计
-
编译原理实验 求first集和follow集 代码
-
燕山大学软件工程编译原理实验报告
-
自动机向正规文法的转换
-
编译原理第三版课后习题及部分答案
评论
共有 条评论