电子科技大学实验报告学生姓名:学号:指导教师:实验地点:计算机软件实验室实验时间:一、实验室名称:计算机实验室二、实验项目名称:词法分析器的设计与实现三、实验学时:4四、实验原理:1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。2.词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。3.状态转换图是有限有向图,是设计词法分析器的有效工具。五、实验目的:通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。六、实验内容:实现求n!的极小语言的词法分析程序,返回二元式作为输出。七、实验器材(设备、元器件).1.操作系统:Windows72.开发工具:visualstudio2008八、实验步骤(1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”-“新建”-“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“VisualC++项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。(2)建立相应的单词符号与种别对照表;(3)根据状态转换图编写相应的处理函数;(4)完成词法分析器;(5)编译与调试以上程序;(6)生成相应的*.dyd文件,作为后面语法分析的输入文件。九、实验数据及结果分析1.结构与分析将源文件与.exe放在同一目录下打开bianyiyuanli1.exe,输入源文件名称,输出文件名称,错误输出名称输出列表如下:Out.dyd里部分内容:2.本实验用的源码Val.h:#includecstring#includecstdio#includestdio.h#includestring.hinttype=0;charval[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};charerrval[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};voidto_outfile();voidto_errfile();Function.husingnamespacestd;boolisletter(charc)//判别是否字母{if(c64&&c91||c96&&c123)returntrue;returnfalse;}boolisdigital(charc)//判别是否数字{if(c47&&c58)returntrue;returnfalse;}intmatch_reserve(char*p)//匹配保留字{if(!(strcmp(p,begin))){type=1;strcpy(val,begin);to_outfile();return1;}elseif(!(strcmp(p,end))){type=2;strcpy(val,end);strcpy(val,end);to_outfile();return1;}elseif(!(strcmp(p,integer))){type=3;strcpy(val,integer);to_outfile();return1;}elseif(!(strcmp(p,if))){type=4;strcpy(val,if);to_outfile();return1;}elseif(!(strcmp(p,then))){type=5;strcpy(val,then);to_outfile();return1;}elseif(!(strcmp(p,else))){type=6;strcpy(val,else);to_outfile();return1;}elseif(!(strcmp(p,function))){type=7;strcpy(val,function);to_outfile();return1;}elseif(!(strcmp(p,read))){type=8;strcpy(val,read);to_outfile();return1;}elseif(!(strcmp(p,write))){type=9;strcpy(val,write);to_outfile();return1;}elsereturn0;}//matchvoidmatch_small(char*p,inttempc)//非保留字、非运算符匹配{chart[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};strcpy(t,p);intk=0;intstate=0;for(k;ktempc;k++){if(isletter(t[k])){state=1;break;}}if(state==0){type=11;strcpy(val,p);to_outfile();}else{type=10;strcpy(val,p);to_outfile();}}//匹配双运算符voidmatch_double_operator(char*p){if(!(strcmp(p,:=))){type=20;strcpy(val,:=);to_outfile();}elseif(!(strcmp(p,))){type=13;strcpy(val,);to_outfile();}elseif(!(strcmp(p,=))){type=14;strcpy(val,=);to_outfile();}elseif(!(strcmp(p,=))){type=16;strcpy(val,=);to_outfile();}}//匹配单个运算符voidmatch_single_operator(char*p){if(!(strcmp(p,))){type=15;strcpy(val,);to_outfile();}elseif(!(strcmp(p,))){type=17;strcpy(val,);to_outfile();}elseif(!(strcmp(p,-))){type=18;strcpy(val,-);to_outfile();}elseif(!(strcmp(p,*))){type=19;strcpy(val,*);to_outfile();}elseif(!(strcmp(p,=))){type=13;strcpy(val,=);to_outfile();}elseif(!(strcmp(p,())){type=21;strcpy(val,();to_outfile();}elseif(!(strcmp(p,)))){type=22;strcpy(val,));to_outfile();}elseif(!(strcmp(p,;))){type=23;strcpy(val,;);to_outfile();}else{type=0;strcpy(val,p);strcpy(errval,p);to_outfile();to_errfile();}}Scanner.cpp#includeiostream#includeval.h#includefstream#includefunction.husingnamespacestd;ifstreamsourcefile;/////源程序文件ofstreamoutfile;//打开分析结果二元表ofstreamerrfile;//打开错误记录表charbuffer[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//读入缓冲区chartemp[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};chartail[2]={0,0};voidto_outfile(){outfileval;outfile;outfiletype;for(inti=0;i15;i++){val[i]=0;}outfile\n;outfile\n;}.voidto_errfile(){errfileerrval;errfile;errfiletype;for(inti=0;i15;i++){errval[i]=0;}errfile\n;outfile\n;}intmain(intargc,char*argv[]){staticcharSourceFileName[256];staticcharOutputFileName[256];staticcharErrorFileName[256];intcount=0;//读字符计数器coutPleaseinputthepathandthefilenameofyoursourcefile:endl;cinSourceFileName;sourcefile.open(SourceFileName);if(!sourcefile.is_open()){coutOpenfailed!PleaseCheckThePath!endlendl;cin.get();return0;}coutPleaseinputthefilenameofyouroutputfile:endl;cinOutputFileName;coutPleaseinputthefilenameofyourerrorfile:endl;cinErrorFileName;outfile.open(OutputFileName);errfile.open(ErrorFileName);while(sourcefilebuffer){//当还有数据可读(没读到EOF的时候)读入一个单词长度的字符(读到空格或回车)if(buffer[0]==0){break;}intnext=0;//指针指向缓存数组intsmall=0;//非运算符(标识符)数组长度while((next15)&&(buffer[next]!=0)){//遍历所有单词字符if((isletter(buffer[next]))||(isdigital(buffer[next]))){//将字母和数字加入small数组small++;tail[0]=buffer[next];strcat(temp,tail);next++;if(buffer[next]==0){//如果非运算符处于单词末尾处理small数组if(temp[0]!=0){intfm=match_reserve(temp);//匹配保留字if(fm==1){for(intj=0;j15;j++){temp[j]=0;}tail[0]=0;tail[1]=0;small=0;}if(fm==0){match_small(temp,small);for(intj=0;j15;j++){temp[j]=0;}tail[0]=0;tail[1]=0;small=0;}}}}else{//遇到运算符//先对small数组即标识符处理if(temp[0]!=0){Intfm=match_reserve(temp);//匹配保留字if(fm==1){for(intj=0;j15;j++){temp[j]=0;}tail[0]=0;tail[1]=0;small=0;}if(fm==0){match_small(temp,small);for(intj=0;j15;j++){temp[j]=0;}tail[0]=0;tail[1]=0;small=0;}}if(((buffer[next]==':')&&(buffer[next+1]=='='))||((buffer[next]=='')&&(buffer[next+1]=='='))||((buffer[next]=='')&&(buffer[next+1]=='='))||((buf