1、测试过程:(实验中出现的问题、错误、解决方法)实验总结:通过本次试验,了解了此法分析器的设计思想,词法分析器的工作原理,以及对前面的知识进行了回顾和很好的复习签名: 年 月 日评语与成绩: 教师签名:年 月 日洛阳师范学院信息技术学院软件实验报告实验名称 词法分析实验实验类型 设计型 实验时间实验环境 Windows Xp,vc+实验目的与要求:了解词法分析器设计思想以及词法分析器的工作原理。实验内容:1 Token 字编码:(1)关键字种别码编号为自 1 至 32 (2)标示符种别码编号为 33(3)数字(整数浮点数)种别码编号为 34(4)界码及逻辑运算符种别码依次编码为 36-56(5)
2、注释种别码编号2函数构成:本程序主要由三个函数构成即主函数 main 和两个自定义函数 scan 和 cmp(1)main 函数主要是用来判断输入文件和输出文件存在与否,并把两个文件的头指针赋给*fpin *fpout,用于输入调用字符串,并向外文件输出 token 字。另外主函数完成调用函数 scan 和 cmp 的功能实现 token 字的分类编码输出。(2)scan 函数是本程序的核心程序,是用来实现各种类型词的分类识别,并完成相应的种别码和 token 字向外文件的输出。其中函数内部用到isdigit,getc,fprintf ,isalpha,fseek 等函数库内的实例函数。(3)
3、cmp 主要用于含字母的词(即关键字和标示符)区分,首先和个数较少的关键字比较匹配,不是关键字便是标示符。3注意事项:(1)fseek 函数的使用保证指针能够合理的跳转,避免个别字符没有被函数判别匹配。(2)C 语言中标示符中可以含有数字字母下划线,其中第一位的只可以是字母。(3)数字包括浮点和整数涉及到小数点,判断是否是数字的同时要考虑到非数字的小数点(4)自定义的字符数组本身是字符串应该结尾是0不能缺省。实验步骤:(算法描述、源程序、操作步骤和方法)词法分析器的运行过程:首先是由主函数开始判断 in.txt 是否存在,如果不存在则从键盘输入字符串到fpin 指向的文件中,再判断 token
4、 字输出指向的文件是否存在,如果没有则在判断过程中通过w+创建一个 out.txt 文件。然后调用函数 scan 开始对文件中的字符串进行判别,首先判断首字符是否为字母是的话将根据标示符的构造准则,若是則将整个字符串存入到 str120中,然后调用cmp 函数进行判断是否是关键字,是则输出关键字及其种别码,否则输出标示符及其种别码。否则如果首字符是数字则判断其结束的标志即最后一位不是数字时(若是小数点存在则跳过小数点至到下一位不是数字时跳出)然后输出其种别码 34 及其数字。其他各种字符通过 if else 嵌套判断输出相应的种别码和其字符本身。直到外循环当文件指针指到文件的结束指针或者是#(
5、输入字符串时约定的文件结束符)时,停止执行循环.最终完成输入文件的此法分析任务。词法分析程序源代码:#include #include #include #include #include struct keyint xuhao1;char keychar20;key32=1,“auto“,2,“break“,3,“case“,4,“char“,5,“const“,6,“continue“,7,“default“,8,“do“,9,“double“,10,“else“,11,“enum“,12,“extern“,13,“float“,14,“for“,15,“goto“,16,“if“,17,
6、“int“,18,“long“,19,“register“,20,“return“,21,“short“,22,“signed“,23,“sizeof“,24,“static“,25,“struct“,26,“switch“,27,“typedef“,28,“union“,29,“unsigned“,30,“void“,31,“volatatile“,32,“while“;int j=0;int n=33; /*标示符的种别码记为 33*/int m=34; /*数字的种别码编号为 34*/int t=35; /*注释的种别码编号为 35*/int k; /*通过观察的 k 是否为 0 值判断
7、字符串是否匹配*/char f;FILE *fp,*fpin,*fpout,*in,*out;scan(FILE *in);cmp(char str20 ) /*首先和关键字进行匹配区别标示符*/ int i=0;struct key *p;p=do k=strcmp(str,p-keychar); i+;while(k!=0fprintf( fpout,“%d,%sn“,p-xuhao1,p-keychar);elseputchar(n);printf(“%d,%sn“,n,str);fprintf(fpout,“%d,%sn“,n,str);scan(FILE *fp) char chf;
8、while(chf=fgetc(fp)!=EOFchar str120;dostr1p+=chf;chf=getc(fp);while(chf=0if(chf=)printf(“52,=n“);fprintf(fpout,“%dt%sn“,52,“=“); else printf(“53,n“);fprintf(fpout,“%dt%sn“,53,“);fseek(fp,-1L,1);else if(chf=!) chf=getc(fp);if(chf=) printf(“54,!=n“);fprintf(fpout,“%dt%sn“,54,“!=“);else printf(“55,!n“)
9、;fprintf(fpout,“%dt%sn“,55,“!“);fseek(fp,-1L,1);else printf(“ cannt recognize symboln“);fprintf(fpout,“ cannt recognize symbol %cn“,chf) ;main()long i;if(fpin=fopen(“D:in.txt“,“w+“)=NULL) /*判断输入文件是否存在*/printf(“cant open in.txt or there is no in.txt“);else printf(“please putin file with # in the end
10、:n“);while(f!=#) /* 不存在时从键盘输入字符串*/f=getchar();printf(“%c“,f);fprintf(fpin,“%c“,f); /*向源文件中输入字符*/if(fpout=fopen(“d:out.txt“,“w+“)=NULL) /*判断输出文件是否存在*/printf(“cant open in.txt or there is no in.txt“); exit(1);i=ftell(fpin);if(i=-1)printf(“errorn“); fseek(fpin,-i,1);scan(fpin);fclose(fpin);fclose(fpout);实验步骤:(算法描述、源程序、操作步骤和方法)