实验报告班级:2011211314姓名:oneseven学号:一.题目:词法分析程序设计与实现二.实验内容:设计并实现C语言的词法分析程序,要求如下。(1)可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。(2)可以识别并读取源程序中的注释。(3)可以统计源程序中的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果。(4)检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。三.实现要求:采用C/C++作为实现语言,手工编写词法分析程序。四.实现功能:基本完成了实验内容中要求的所有功能。(1)识别出源程序中的每个单词符号,并以记号的形式输出每个单词符号(2)识别并读取源程序中的注释(3)统计源程序中的语句行数、单词个数和字符个数(4)检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。注:本程序未把注释中的单词符号,“”中的单词符号统计在单词个数中。单词个数只包括了标示符,关键字,无符号数。五.实验原理:1.词法分析程序的功能:输入源程序,输出单词符号的记号形式,如图所示:源程序词法分析器单词符号的记号形式2.处理过程:每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。六.代码#includeiostream#includefstream#includestring词法分析器#includeiomanipusingnamespacestd;stringkeyword[32]={auto,break,case,char,const,//关键字continue,default,do,double,else,extern,enum,float,for,goto,if,int,long,return,register,static,short,signed,unsigned,struct,switch,sizeof,typedef,union,volatile,void,while};intcolumn=0,row=1,character=0,word=0;ifstreaminf(test.txt,ios::in);charc;intfind_key(stringword)//匹配关键字{for(inti=0;i32;i++)if(keyword[i].compare(word)==0)return1;return0;}voidchoice(){while(c=='\n'||c==''||c=='\t')//不计空白符{if(c=='\n'){row++;column=0;//row清零,重新计数另一行}c=inf.get();column++;}return;}voidget()//读取字符{character++;c=inf.get();column++;return;}intprocess(){stringstr=;if(inf.fail())cout请创建test.txt并输入程序endl;else{ofstreamoutf(out.txt);outfsetw(10)正规表达式setw(30)记号setw(30)属性endl;c=inf.get();column++;while(c!=EOF){switch(c){//匹配字符对应记号case'a'...'z':case'A'...'Z':case'_':word++;while(isalpha(c)||isdigit(c)||c=='_'){str+=c;get();}if(c=='@'||c=='?'||c=='$'||c=='#'){inttag=column;while(isalpha(c)||isdigit(c)||c=='_'||c=='@'||c=='?'||c=='$'||c=='#'){str+=c;get();}outfsetw(10)strsetw(30)ERRORsetw(30)错误在第row行第tag列endl;str=;break;}if(find_key(str)){outfsetw(10)strsetw(30)strsetw(30)关键字endl;str=;}else{outfsetw(10)strsetw(30)idsetw(30)标示符endl;str=;}break;case'0'...'9':word++;while(isdigit(c)||c=='.'||c=='e'||c=='E'){str+=c;if(c=='e'||c=='E'){get();str+=c;}get();}if(isalpha(c)){inttag=column;while(isalpha(c)||c=='_'||isdigit(c)||c=='@'||c=='?'||c=='$'||c=='#'){str+=c;get();}outfsetw(10)strsetw(30)ERRORsetw(30)错误在第row行第tag列endl;str=;break;}outfsetw(10)strsetw(30)numsetw(30)无符号数endl;str=;break;case'':get();if(c=='=')outfsetw(10)=setw(30)relopsetw(30)关系运算符endl;elseif(c=='')outfsetw(10)setw(30)bit_opsetw(30)位运算符endl;else{outfsetw(10)setw(30)relopsetw(30)关系运算符endl;break;}get();break;case'':get();if(c=='=')outfsetw(10)=setw(30)relopsetw(30)关系运算符endl;elseif(c=='')outfsetw(10)setw(30)bit_opsetw(30)位运算符endl;else{outfsetw(10)setw(30)relopsetw(30)关系运算符endl;break;}get();break;case'=':get();if(c=='=')outfsetw(10)==setw(30)relopsetw(30)关系运算符endl;else{outfsetw(10)=setw(30)assign_opsetw(30)赋值符endl;break;}get();break;case'!':get();if(c=='=')outfsetw(10)!=setw(30)relopsetw(30)关系运算符endl;else{outfsetw(10)!setw(30)logic_opsetw(30)逻辑运算符endl;break;}get();break;case'|':get();if(c=='|')outfsetw(10)||setw(30)relopsetw(30)逻辑运算符endl;else{outfsetw(10)|setw(30)logic_opsetw(30)位运算符endl;break;}get();break;case'&':get();if(c=='&')outfsetw(10)&&setw(30)relopsetw(30)逻辑运算符endl;else{outfsetw(10)&setw(30)logic_opsetw(30)位运算符endl;break;}get();break;case'+':get();if(c=='+')outfsetw(10)++setw(30)alg_opsetw(30)运算符endl;elseif(c=='=')outfsetw(10)+=setw(30)alg_opsetw(30)运算符endl;else{outfsetw(10)+setw(30)alg_opsetw(30)运算符endl;break;}get();break;case'-':get();if(c=='-')outfsetw(10)--setw(30)alg_opsetw(30)运算符endl;elseif(c=='=')outfsetw(10)-=setw(30)alg_opsetw(30)运算符endl;else{outfsetw(10)-setw(30)alg_opsetw(30)运算符endl;break;}get();break;case'*':get();if(c=='=')outfsetw(10)*=setw(30)alg_opsetw(30)运算符endl;else{outfsetw(10)*setw(30)alg_opsetw(30)运算符endl;break;}get();break;case'\':str+=c;get();while(c!='\'){str+=c;get();if(c==''||c=='\t')character--;}str+='\';outfsetw(10)strsetw(30)literalsetw(30)字符串endl;str=;get();break;case'/':str+=c;get();if(c=='=')outfsetw(10)/=setw(30)alg_opsetw(30)运算符endl;elseif(c=='/'){str+=c;get();while(c!='\n'&&c!=EOF){str+=c;get();}character--;outfsetw(10)strsetw(30)annotationsetw(30)注释endl;}elseif(c=='*'){str+=c;get();chartag=c;while(tag!='*'&&c!='/'&&c!=EOF){str+=c;tag=c;choice();get();}str+=c;outfsetw(10)strsetw(30)annotationsetw(30)注释endl;}else{outfsetw(10)/setw(30)alg_opsetw(30)运算符endl;str=;break;}str=;get();break;case'':case'\n':caseEOF:break;default:outfsetw(10)csetw(30)csetw(30)符号endl;get();break;}choice();}outf语句行数:rowendl;outf单词个数:wordendl;outf字符个数:characterendl;inf.close();outf.close();return1;}inf.close();return0;}intmain(){intflag;flag=process();if(f