您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理实验报告-编写词法分析程序
编译原理实验报告实验名称:编写词法分析程序实验类型:验证型实验指导教师:专业班级:姓名:学号:电子邮件:实验地点:实验成绩:日期:201年4月20日一、实验目的通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论;掌握文法转换成自动机的技术及有穷自动机实现的方法;确定词法分析器的输出形式及标识符与关键字的区分方法;加深对课堂教学的理解;提高词法分析方法的实践能力;通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上机调试编出的词法分析程序。二、实验过程先思考如何实现,画出流程图,然后变成实现所需功能。流程图如下:三、实验结果词法分析实验成功。四、讨论与分析本以为这个程序会很难,没想到真正写起来感觉还不错。主要是要先画好流程图,有个自己的思路,这样才好进行下一步。流程图很关键,一方面在自己写起来的时候,思路清晰,明了;另一方面,也可以让别人很轻松的看懂你的程序思想。五、附录:关键代码(给出适当注释,可读性高)#includestdio.h#includectype.h#includestring.h//保留字表char*keyword[8]={if,else,for,while,do,int,read,write};//纯单分界符charsingleword[50]=+-*(){};,:#&|;//双分界符chardoubleword[10]==!&;//用于接收输入输出文件名charScanin[300],Scanout[300];//用于指向输入输出文件的指针FILE*fin,*fout;//词法分析函数intTESTscan(){charch,token[40];intes=0,j,n;printf(请输入源程序文件名(包括路径):);scanf(%s,Scanin);printf(请输入词法分析输出文件名(包括路径):);scanf(%s,Scanout);if((fin=fopen(Scanin,r))==NULL){printf(\n打开词法分析输入文件出错!\n);es=1;}if((fout=fopen(Scanout,w))==NULL){printf(\n创建词法分析输出文件出错!\n);es=2;}ch=getc(fin);while(ch!=EOF){while(ch==''||ch=='\n'||ch=='\t')ch=getc(fin);if(isalpha(ch)){token[0]=ch;j=1;ch=getc(fin);while(isalnum(ch)){token[j++]=ch;ch=getc(fin);}token[j]='\0';n=0;while((n8)&&strcmp(token,keyword[n]))n++;if(n=8){fprintf(fout,%s\t%s\n,标识符,token);printf(%s\t%s\n,标识符,token);}else//是保留字输出保留字{fprintf(fout,%s\t%s\n,保留字,token);printf(%s\t%s\n,保留字,token);}}elseif(isdigit(ch)){token[0]=ch;j=1;ch=getc(fin);while(isdigit(ch)){token[j++]=ch;ch=getc(fin);}token[j]='\0';fprintf(fout,%s\t%s\n,无符号整数,token);printf(%s\t%s\n,无符号整数,token);}elseif(strchr(singleword,ch)0){token[0]=ch;token[1]='\0';ch=getc(fin);fprintf(fout,%s\t%s\n,单分界符,token);printf(%s\t%s\n,单分界符,token);}elseif(strchr(doubleword,ch)0){token[0]=ch;ch=getc(fin);if(ch=='='){token[1]=ch;token[2]='\0';ch=getc(fin);}elseif(ch=='&'){token[1]=ch;token[2]='\0';ch=getc(fin);}elsetoken[1]='\0';fprintf(fout,%s\t%s\n,双分界符,token);printf(%s\t%s\n,双分界符,token);}elseif(ch=='/'){ch=getc(fin);if(ch=='*'){charch1;ch1=getc(fin);do{ch=ch1;ch1=getc(fin);}while((ch!='*'||ch1!='/')&&(ch1!=EOF));ch=getc(fin);}else{token[0]='/';token[1]='\0';fprintf(fout,%s\t%s\n,单分界符,token);printf(%s\t%s\n,单分界符,token);}}else{token[0]=ch;token[1]='\0';ch=getc(fin);es=0;fprintf(fout,%s\t%s\n,ERROR,token);printf(%s\t%s\n,ERROR,token);}}fclose(fin);fclose(fout);returnes;}intmain(){intes=0;es=TESTscan();if(es0)printf(词法分析有错!\n);elseprintf(词法分析成功!\n);return0;}六、实验者自评这次最大的收获就是学会画流程图。先给自己一个明确思路,再进行下一步。
本文标题:编译原理实验报告-编写词法分析程序
链接地址:https://www.777doc.com/doc-2068900 .html