编译原理实验报告二计算机5班 西安交通大学.docx
- 文档编号:6892812
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:9
- 大小:83.24KB
编译原理实验报告二计算机5班 西安交通大学.docx
《编译原理实验报告二计算机5班 西安交通大学.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告二计算机5班 西安交通大学.docx(9页珍藏版)》请在冰豆网上搜索。
编译原理实验报告二计算机5班西安交通大学
实验报告
实验课程:
编译原理
学生姓名:
高君宇
学号:
2110505112
专业班级:
计算机15班
2013年11月25日
一、
题目描述
M=128=27,设计I,该表FORTRAN的符号表,以字母开头,后跟1~5个字母或者数字,这样一共有26*365个标识符,他们映像到0~127表项中。
使用hash法来构造这样的符号表。
二、算法描述
采用取中法构造Hash函数,即输入标识符名,其对应的ACSII码构成一个字符串,取这个字符串中间的七位二进制数,作为其在符号表中的地址,处理冲突的方法是不断判断下一位置是否为空,若为空则将此标识符放入。
1、定义符号表的构造函数voidconstruct(char**f);
2、输入标识符名;
3、取其对应的ACSII码构成一个字符串,若此字符串长度大于等于7,取这个字符串中间的七位二进制数;
4、若此字符串长度小于7,则赋为“0000000”;
5、记此字符串所对应的二进制序列数值为pos;
6、判断f[pos]是否为空,若为空则将此标识符放入符号表的这一位置;
7、若不为空,则循环判断其下一位置是否为空,为空则放入;
8、若符号表已满,则输出警告;
9、定义函数intfind(char**f,char*s),用来在符号表中查找某一标识符;
10、查找过程与放入标识符过程大体相似。
三、程序源代码
#include
#include
#include
#include
usingnamespacestd;
voidconstruct(char**f){
//inti=0;
intlen=0;
intpos=0;
intsum=0;
char*temp=newchar[20];
char*s_bin=newchar[100];
char*s_tem=newchar[100];
char*coll="0000000";
cout<<"请输入变量名(以字母开头的字母数字串)";
cin>>temp;
len=strlen(temp);
s_bin[0]='\0';
for(inti=0;i itoa(temp[i],s_tem,2); strcat(s_bin,s_tem); } len=strlen(s_bin); if(len>=7){ s_tem=s_bin+len/2-3; s_tem[7]='\0'; //cout< } else s_tem=coll; intt=atoi(s_tem); //cout< sum+=t/1000000*64; sum+=(t/100000%10)*32; sum+=(t/10000%10)*16; sum+=(t/1000%10)*8; sum+=(t/100%10)*4; sum+=(t/10%10)*2; sum+=t%10; pos=sum; if(f[pos]==NULL){ f[pos]=newchar[20]; strcpy(f[pos],temp); cout< "< } else{ i=pos; if(strcmp(f[pos],temp)==0){ cout<<"已有这个变量! "< return; } while(f[(++pos)%127]! =NULL){ if(strcmp(f[pos],temp)==0){ cout<<"已有这个变量! "< return; } } if(i==pos){ cout<<"符号表中没有空间了! "< return; } else{ f[pos]=newchar[20]; strcpy(f[pos],temp); cout< "< } } cout< } intfind(char**f,char*s){ char*s_tem=newchar[100]; char*s_bin=newchar[100]; char*coll="0000000"; intlen=0; intpos=0; len=strlen(s); s_bin[0]='\0'; for(inti=0;i itoa(s[i],s_tem,2); strcat(s_bin,s_tem); } len=strlen(s_bin); if(len>=7){ s_tem=s_bin+len/2-3; s_tem[7]='\0'; } else s_tem=coll; intt=atoi(s_tem); pos+=t/1000000*64; pos+=(t/100000%10)*32; pos+=(t/10000%10)*16; pos+=(t/1000%10)*8; pos+=(t/100%10)*4; pos+=(t/10%10)*2; pos+=t%10; if(f[pos]==NULL){ cout<<"符号表中没有此标识符! "< return-1; } if(strcmp(f[pos],s)==0) cout< else{ inti=pos; while(strcmp(f[(++pos)%127],s)! =0){ if(i==pos){ cout<<"符号表中没有这个变量! "< return-1;; } } cout< } cout< returnpos; } intmain(){ char*fhb[128]={NULL}; /*for(inti=0;i<128;i++){ fhb[i]=NULL; }*/ char*temp=newchar[20]; charflag='1'; cout<<"向符号表中增加变量请输入1"< cout<<"查询符号表中变量请输入2"< cout<<"退出请输入0"< cin>>flag; cout< while(flag! ='0'){ if(flag=='1'){ construct(fhb); } elseif(flag=='2'){ cout<<"请输入要查找的变量名"< cin>>temp; find(fhb,temp); } elseif(flag=='0') break; cout<<"向符号表中增加变量请输入1"< cout<<"查询符号表中变量请输入2"< cout<<"退出请输入0"< cin>>flag; cout< } return0; } 四、运行结果 五、实验中出现的问题及解决方法 错误处理: 符号表的空间是动态分配的,导致一开始时有许多指针错误。 于是,对于二级指针的使用,我慎之又慎,合理的分配空间,避免指针的悬空。 我所构造的Hash函数有其优点,取中间的7位二进制数,随机性比较强,这样冲突会比较少,但我解决冲突的方法过于简单,可能会导致较长的冲突处理长度。 六、体会、意见或建议 通过本次实验基本掌握了符号表构造的方法,以及hash方法的使用;进一步熟悉了编译程序符号表创建和查询的详细过程。 通过编写程序进一步复习巩固了c语言和数据结构的相关知识,尤其是加深了对指针相关知识的印象;在编程过程中遇到了很多基础性问题,通过不断的查阅课本,最终解决了问题,但程序仍然存在很多值得改进和完善的地方,这就提醒我们在以后的学习过程当中应该及时复习巩固以前学过的相关知识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实验报告二计算机5班 西安交通大学 编译 原理 实验 报告 计算机