编译原理课程设计报告设计符号表专业计算机科学与技术学生姓名班级学号完成日期某某大学编译原理课程设计1目录1前言......................................................................................................................................................22报告主体..............................................................................................................................................22.1设计目的:..................................................................................................................................22.2设计内容及要求:........................................................................................................................22.2.1课程设计内容......................................................................................................................22.2.2设计符号表..........................................................................................................................22.2.3测试范例:..........................................................................................................................32.3实现原理.......................................................................................................................................32.3.1符号表的设计......................................................................................................................32.4算法实现流程图...........................................................................................................................42.5结果输出及分析............................................................................................................................52.6程序源代码...................................................................................................................................62.7心得体会.......................................................................................................................................92.8参考文献........................................................................................................................................91前言在网络世界中,我们往往对功能强大的程序叹为观止。而这些强大程序的背后是编译这些程序的编译软件,是这些编译软件承托起了这些功能强大的运行程序。我们有不少的同志致其自身于无尽的运行程序上。而只有很少的人搞编译程序。这就是为什么中国的可运行程序满天飞,而编译程序却很少。本课程设计就是在这方面的探索,为你解读编译程序的奥秘。课程设计题目选择5个题目中的一个,要求根据自己的兴趣和能力,选择一个对自己意义甚大的题目。课程设计基本原理是在实践上,实现我们在课程上学习到的理论知识。通过理论联系实践,更好的掌握课本上的理论知识。2报告主体2.1设计目的:学生在学习《编译原理》课程设计中,结合各章节的构造编译程序的基本理论,总共用一周的时间完成课程设计。要求用C或C++语言描述及上机调试,实现五个题目中任意一个,是学生将理论与实际应用结合其,起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。2.2设计内容及要求:2.2.1课程设计内容设计符号表2.2.2设计符号表确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。要考虑能够存储有关名字的信息,并可以高效地完成如下操作:1.查找:根据给定的名字,在符号表中查找其信息。如果该名字在符号表中不编译原理课程设计3存在,则将其加入到符号表中,否则返回指向该名字的指针;2.删除:从符号表中删除给定名字的表项。2.2.3测试范例:proceduretest;varb,c,i:integer;beginb:=1;ifabthenc:=a+belsec:=a-b;fori:=0to3dobeginc:=i;end;end;2.3实现原理2.3.1符号表的设计1.符号表的结构#includestdio.h#includestring.h#includectype.h#includestdlib.hstruct{intm;charname[20];charinf[20];}co[999];intnum;include称为文件包含命令,其意义是把尖括号或引号内指定的文件包含到本程序中,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h而stdio为standardinputoutput的缩写,意为“标准输入输出”.。#includestring,h这是C语言/C++中的字符串处理函数的头文件。#includectype.h是用作字符处理的,#includestdlib.h是用于定义杂项函数及内存分配函数,最后是一个结构函数,分别定义了符号名,信息,个数等变量。42.符号显示在C-Free中用了voiddisplay(),将已经输入进系统的符号全部都显示出来3.符号查找本符号表系统中用voidfind(),并通过for循环将所要查找的符号及其信息全都显示出来。如果查找的字符存在,则在显示之前,运用system(“cls”)进行了清屏,把之前屏幕上所显示的内容全部清除,同时,在显示完成以后,又用了if语句判断是否要删除此符号及其信息。如果要删除信息,则将该符号中的数拷贝到另一个数组中去。如果查找的字符不存在,则提示是否添加此字符。4.符号添加采用voidadd(),将需要添加的符号及其信息添加进系统,还是通过使用for语句,将符号信息一个个地输入进系统。2.4算法实现流程图开始初始化变量和数组输入查找的字符字符存在添加符号删除符号添加到文件在文件中删除YNYYNN查找字符Y退出N编译原理课程设计52.5结果输出及分析系统首页显示:添加一个符号后显示如下:按1查找后显示如下:按Y删除符号后显示如下:按1查找后显示如下:6按Y添加符号后显示如下:2.6程序源代码#includestdio.h#includestring.h#includectype.h#includestdlib.hstruct{intm;charname[20];charinf[20];}co[999];intnum;voiddisplay()/*符号显示*/{printf(*************\n);printf(———————————符号表——————————————\n);printf(符号信息\n);printf(————————————————————————————————\n);for(inti=0;inum;i++){printf(%19s,co[i].name);printf(%34s\n,co[i].inf);}printf(————————————————————————————————\n);printf(*************\n);printf(目前为止已有%d个符号\n\n,num);}voidfind()/*符号查找*/{inti;system(cls);printf(请输入你想要查找的符号名:);charf[20];scanf(%s,&f);编译原理课程设计7printf(*************\n);printf(———————————符号表——————————————\n);printf(符号信息\n);printf(————————————————————————————————\n);for(i=0;inum;i++){if(strcmp(co[i].name,f)==0){printf(\n\n);printf(%7s,co[i].name);printf(%24s\n\n\n,co[i].inf);printf(————————————————————————————————\n);printf(*************\n);printf(是否要删除此符号YorN?:);charp;scanf(%s,&p);if(p=='Y'||p=='Y'){strcpy(co[i].name,co[num-1].name);strcpy(co[i].inf,co[num-1].inf);co[num-1].m==0;num--;printf(此符号已经删除!\n\n);}return;}}if(i=num){charz[20];strcpy(z,f);printf(没有要查找的符号,是否要添加此符号YorN?:);charp;scanf(%s,&p);if(p=='Y'||p=='Y'){co[num].m==1;strcpy(co[num].name,z);printf(请输入此符号信息:);charx[20];scanf(%s,&x);strcpy(co[num].inf,x);num++;co[num].m==0;printf(此符号添加成功!\n\n);}}}voidadd()/*符号添加*/{intk;printf(此表为空,请输入需要添加的符号个数:);scanf(%d,&k);for(inti=0;ik;i++){chara[20],b[20];intc;c=i+1;co[i].m=1;printf(第%d个符号名:,c);scanf(%s,&a);strcpy(co[i].name,a);8printf(第%d个符号信息:,c);scanf(%s,&b);s