您好,欢迎访问三七文档
课程设计报告课程设计名称:语法分析器系部名称:中印计算机软件学院学生姓名:张蓝班级:11级计算机科学与技术班学号:201101450042成绩:指导教师:王志勇开课时间:2015-2016学年第学期目录词法分析器......................................................................................21.1设计题目................................................................................21.2设计目的................................................................................21.3设计要求................................................................................21.4设计内容................................................................................21.5设计环境................................................................................21.6概要分析................................................................................21.7设计步骤................................................................................41.8编程调试................................................................................51.9测试......................................................................................111.10结论......................................................................................13词法分析器设计一、设计题目c语言的词法分析器二、设计目的1、掌握词法分析器的原理2、掌握编制程序的步骤和方法3、掌握词法分析器的调试过程并成功调试4、加深对词法分析器的理解三、设计要求要明确各个关键字的编码及所代表的值并最终完成词法分析器的实验结果,并将结果以文本形式输出。四、设计内容使用高级语言编写词法分析程序并将其实现得出结果。五、设计环境windows7操作系统、MicrosoftVisualStudioc#开发平台六、概要分析从源代码读入并得出关键字,最后将其存入到指定位置。(1)主要符号的编码如下:单词符号编码单词符号编码单词符号编码Int1Double2Break3Switch4Char5Union6Float7Double8Return9Short10Void11Default12for13if14goto15long16\t17\d18\,19\020*21(2)词法分析器的结构图6.1词法分析器的结构七、设计步骤#includectype.h#includestring.hvoidmain(){FILE*fp,*fp1;inthanjsq=1;//行计数器,保存行号intguanjz(charch1[]);//关键字和标识符判断charch,infile[15],outfile[15];//定义输入和输出文件名printf(*****************Entertheinfilename*******************\n);scanf(%s,infile);//输入需要扫描的文件名printf(*****************Entertheoutfilename******************\n);scanf(%s,outfile);//输入需要另存为的文件名if((fp=fopen(infile,r))==NULL)//打开需要扫描的文件{printf(cannotopenfile\n);exit(0);}if((fp1=fopen(outfile,w))==NULL)//打开需要存入的文件{printf(cannotopenfile\n);exit(0);}printf(\n*********************************************************\n);printf(*》开始进行词法分析《*\n);printf(*********************************************************\n);printf(\n*********************************************************\n);printf(行号字符串种别码\n);printf(*********************************************************\n);fprintf(fp1,*********************************************************\n);fprintf(fp1,行号字符串种别码\n);fprintf(fp1,*********************************************************\n);while(!feof(fp)){ch=fgetc(fp);if(ch==10)hanjsq++;/**********************扫描头文件单词及保留字***********************/if(isalpha(ch)||ch=='_')//如果第一个字符为字母或下划线则判断为标识符{inti=0;charch1[30];//假定每个标识符最长为ch1[i++]=ch;//将ch保存到ch1[0]中并使i自加1while(!feof(fp)){ch=fgetc(fp);if(ch==10)hanjsq++;//如果ch为换行符,则行计数器自加1if(isalpha(ch)||isdigit(ch)||ch=='_'){//如果ch为字母、数字或下划线就把ch放到ch1[i]中并使i自加1ch1[i++]=ch;}if(ch=='.')//如果ch为小数点则判断是否为头文件{if((ch=fgetc(fp))=='h')//如果小数点后一位为h则判定其为头文件{if(ch==10)hanjsq++;ch1[i++]='.';ch1[i++]='h';ch1[i]='\0';//把结束标志放到ch1[i]中作为单词结束标志printf(line%d:%s83\n,hanjsq,ch1);//以字符串形式输出ch1fprintf(fp1,line%d:%s83\n,hanjsq,ch1);break;}else//如果小数点后一位不是h则判定其为标识符{fseek(fp,-1,1);//fp回退1ch1[i]='\0';//把结束标志放到ch1[i]中作为单词结束标志printf(line%d:%s%d\n,hanjsq,ch1,guanjz(ch1));//以字符串形式输出ch1fprintf(fp1,line%d:%s%d\n,hanjsq,ch1,guanjz(ch1));break;}}if(!isalpha(ch)&&!isdigit(ch)&&ch!='_'&&ch!='.'){//如果ch不为字母、数字、下划线和点时判断其为标识符ch1[i]='\0';printf(line%d:%s%d\n,hanjsq,ch1,guanjz(ch1));fprintf(fp1,line%d:%s%d\n,hanjsq,ch1,guanjz(ch1));break;}}}/************************扫描数字*************************/if(isdigit(ch)||ch=='-')//如果ch为数字或'-'{if(isdigit(ch))//如果ch为数字{printf(line%d:%c,hanjsq,ch);fprintf(fp1,line%d:%c,hanjsq,ch);while(!feof(fp)){ch=fgetc(fp);//预读一位如果ch为数字和点则循环输出if(isdigit(ch)||ch=='.'){printf(%c,ch);fprintf(fp1,%c,ch);}else//否则视为数字结束{printf(46\n);fprintf(fp1,46\n);fseek(fp,-1,1);//回退一位ch='0';//置ch为0,以免影响下面误判并顺利退出扫描数字break;}}}if(ch=='-')//如果ch为'-'{ch=fgetc(fp);//预读一位if(ch=='-')//如果ch还是为'-'则判断为自减符'--'{printf(line%d:--80\n,hanjsq);fprintf(fp1,line%d:--80\n,hanjsq);}if(ch=='')//如果ch为'',则判断为结构体运算符'-'{printf(line%d:-81\n,hanjsq);fprintf(fp1,line%d:-81\n,hanjsq);}if(isdigit(ch))//如果ch为数字则可能为减号或负号{fseek(fp,-3,1);//回退3为判断ch=fgetc(fp);if(isdigit(ch))//如果ch为数字则判断'-'为减号{ch=fgetc(fp);printf(line%d:%c79\n,hanjsq,ch);fprintf(fp1,line%d:%c79\n,hanjsq,ch);}else//否则判断'-'为负号{ch=fgetc(fp);printf(line%d:%c,hanjsq,ch);fprintf(fp1,line%d:%c,hanjsq,ch);while(!feof(fp)){ch=fgetc(fp);//预读一位如果ch为数字和点则循环输出if(isdigit(ch)||ch=='.'){printf(%c,ch);fprintf(fp1,%c,ch);}else//否则视为数字结束{printf(46\n);fprintf(fp1,46\n);fseek(fp,-1,1);//回退1break;}}}}}}/***********************扫描注释************************/if(ch=='/')//如果ch为'/'则可能为注释{ch=fgetc(fp);//读下一个字符if(ch==10)hanjsq++;if(ch=='/')//如果该字符也为'/'则判断为注释一行{while(fgetc(fp)!=10);if(ch==10)hanjsq++;//直到遇到换行符出现才认为注释结束}if(ch=='*')//如果该字符为'*'则判断为注释多行{//直到出现'*/'才认为注释结束while(!feof(fp)){ch=fgetc(fp);if(ch==10)hanjsq++;if(ch=='*')//出现'*'{//且接着出现'/'if((ch=fgetc(fp))=='/'){break;}}}}else//否则原样输出'/'{print
本文标题:词法分析器
链接地址:https://www.777doc.com/doc-2026519 .html