编译原理程序设计实验报告——词法分析扫描器的设计实现实验目标:输入一段程序,设计词法分析器对其进行分析,并输出该程序的token序列。实验内容:(1)概要设计(2)流程图主程序流程图:扫描子程序流程图:(3)关键函数GetChar():将下一个输入字符读到ch中,搜索指示器前移一个字符位置;GetBC():检查ch中的字符是否为空白。若是,则调用GetChar();Cincat():将ch中的字符连接到strToken之后;Reserve():整型函数过程,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0值。源程序代码:#includeiostream#includefstream#includecstringusingnamespacestd;#defineMAX100//保留字个数#defineLIST_MAX_LENGTH100charch='';//存放最新读进的字符charstrToken[LIST_MAX_LENGTH];//单词符号长度intlen=0;//单词符号的长度ints=0;//判断是否多读一位typedefstruct{char*str;intcode;//种别码}Word;//关键字描述Wordkey[6]={{int,4},{main,5},{void,6},{if,7},{else,8},{char,9}};charGetChar()//读一个字符{ch=getchar();if(ch!='/n')returnch;return'';}charGetBC()//检查ch是否为空白{while(ch=='')ch=GetChar();returnch;}voidConcat()//连接{strToken[len]=ch;len++;}intReserve(charstrToken[])//判断是否为保留字{for(inti=0;i6;i++)if(strcmp(key[i].str,strToken)==0){return(key[i].code);}return0;}intIsLetter()//判断是否为字母{if(((ch='z')&&(ch='a'))||((ch='Z')&&(ch='A')))return1;elsereturn0;}intIsDigit()//判断是否为数字{if(ch='0'&&ch='9')return1;elsereturn0;}voidInsertId()//插入符号表{ofstreamoutfile(symbol.txt,ios::app);for(inti=0;ilen;i++){outfilestrToken[i];}outfileendl;outfile.close();}voidInsertConst()//插入常数表{ofstreamoutfile(number.txt,ios::app);for(inti=0;ilen;i++){outfilestrToken[i];}outfileendl;outfile.close();}intmain(){cout请输入字符串代码:endl;if(s!=1){GetChar();}while(ch!=10){GetBC();if(IsLetter()){while(IsLetter()){Concat();GetChar();}s=1;if(Reserve(strToken)){coutstrToken,Reserve(strToken)endl;len=0;memset(strToken,0,sizeof(strToken));//清空数组}else{coutstrToken,0endl;InsertId();len=0;memset(strToken,0,sizeof(strToken));}}elseif(IsDigit()){while(IsDigit()){Concat();GetChar();}s=1;coutstrToken,3endl;InsertConst();len=0;memset(strToken,0,sizeof(strToken));}elseif(ch=='='){cout=,13endl;s=0;}elseif(ch==''){cout,14endl;s=0;}elseif(ch==''){cout,15endl;s=0;}elseif(ch=='+'){cout+,16endl;s=0;}elseif(ch=='-'){cout-,17endl;s=0;}elseif(ch=='*'){cout*,18endl;s=0;}elseif(ch=='/'){cout/,19endl;s=0;}elseif(ch=='{'){cout{,20endl;s=0;}elseif(ch=='}'){cout},21endl;s=0;}elseif(ch==','){cout,,22endl;s=0;}elseif(ch==';'){cout;,23endl;s=0;}elseif(ch=='('){cout(,24endl;s=0;}elseif(ch==')'){cout),25endl;s=0;}elsecoutch错误处理endl;if(s!=1){GetChar();}}return0;}程序运行结果:输入:输出: