.词法分析器实验报告专业资料word.实验目的:设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。功能描述:该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳过错误部分继续进行)设计思想:设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。符号表:专业资料word.记号类别属性值-ws-保留1const保留1var保留1call保留1begin保留1if保留1while保留1do保留1odd保留1end保留1then保留1procedure运算2=运算2<运算2<=运算2<>运算2>运算2>=运算2*运算2+运算2-运算2/运算:=2标识3ident专业资料word.常数4number分隔符5(分隔5)分隔;5分隔,5分隔.5状态转换图:①标识符及保留字:letterordigittletterStartnumber:②otherotherdigitdigitdigitdigit+|-Estartdigit.digit6510234digitE③关系操作符:专业资料word.=start<)<=,2>)<>,2other*)(<,2=)=,>=)>=,2other*(>,2)=(:=,2)④分隔符:专业资料word.;start(;,5)(((,5))(),5),.(,,5)(.,5)算术运算符:⑤+start(+,2)-(-,2)*/(*,2)(/,2)使用环境:visualc++6.0Windowsxp下的程序测试:专业资料word.input1:inta,b;a=b+2;input2:while(a>=0)do7x=x+6.7E+23;end;input3:begin:x:=9ifx>0thenx:=x+1;whilea:=0dob:=2*x/3,c:=a;end;output2:output1:4,2output2:5,;3,int1,while3,a5,(5,,3,a3,b2,>=5,;4,03,a5,)2,=1,do3,berrorline32,+专业资料word.output3:3,c2,=output3:2,:=3,x1,begin2,+3,aerrorline14,6.7E+235,;3,x5,;1,end2,:=1,end5,;4,95,;1,if3,x2,>4,01,then3,x2,:=3,x2,+4,15,;1,while3,a2,:=4,01,do3,b2,:=4,22,*3,x2,/4,35,,专业资料word.测试结果与预期结果一致源程序代码:#include<stdio.h>#include<string.h>voidmain(){inti=0,j,k=0,state=1,f=0,linenum=1;chara[11][10]={const,var,call,egin,if,while,do,odd,end,hen,procedure};charb,d[40]={\freopen(input.txt,,stdin);freopen(output.txt,w,stdout);b=getchar();while(b!=EOF)/*判断所输入字符是否为结束符*/{if(b==''||b=='\n'||b=='\t')/*滤过空格、换行等分隔符号*/{if(b='\n')linenum++;b=getchar();}*/elseif((b>='a'b<='z')||(b>='A'b<='Z'))/*识别标识符以及保留字{d[i++]=b;b=getchar();while((b>='a'b<='z')||(b>='A'b<='Z')||(b>='0'b<='9')){d[i++]=b;b=getchar();}*/查询保留字表确定该单词是否是保留字for(j=0;j<11;j++)/*{if(strcmp(d,a[j])==0)printf(,%s\n,d);{k=1;专业资料word.break;}}if(k==0)/*在保留字表中没有查到该单词,是标识符*/printf(,%s\n,d);for(j=0;j<=i;j++)j]='\0';d[i=0;k=0;}elseif(b>='0'b<='9')/*识别常数*/{d[i++]=b;b=getchar();while(f!=1){switch(state){case1:if(b>='0'b<='9'){state=1;d[i++]=b;b=getchar();}elseif(b=='.'){state=2;d[i++]=b;b=getchar();}elseif(b=='E'){state=4;d[i++]=b;b=getchar();}elsestate=7;break;case2:if(b>='0'b<='9'){state=3;d[i++]=b;b=getchar();}elsestate=8;break;case3:if(b>='0'b<='9'){state=3;d[i++]=b;专业资料word.b=getchar();}elseif(b=='E'){state=4;d[i++]=b;b=getchar();}elsestate=7;break;case4:if(b=='+'||b=='-'){state=5;d[i++]=b;b=getchar();}elseif(b>='0'b<='9'){state=6;d[i++]=b;b=getchar();}elsestate=8;break;case5:if(b>='0'b<='9'){state=6;d[i++]=b;b=getchar();}elsestate=8;break;case6:if(b>='0'b<='9'){state=6;d[i++]=b;b=getchar();}elsestate=7;break;case7:f=1;break;case8:f=1;break;}}if(state==7(b<'a'||b>'z')(b<'A'||b>'Z'))printf(,%s\n,d);elseif(state==7(b>='a'b<='z')||(b>='A'b<='Z'))/*数字后接字母的...