南京航空航天大学金城学院目录一.概述.....................................................................................................3二.总体方案设计.....................................................................................2三.详细设计.............................................................................................4四.程序的调试与运行结果说明............................................................6五.课程设计总结.....................................................................................7六.后记.....................................................................................................7七.附录.....................................................................................................7参考文献.................................................................................................133一概述1.课程设计的目的能够采用C编程语言实现简单的词法分析程序;设计、编制并调试一个词法分析程序,加深对词法分析原理的理解2.课程设计的要求1、对单词的构词规则有明确的定义;2、编写的分析程序能够正确识别源程序中的单词符号;3、识别出的单词以单词符号,种别码的形式保存在符号表中(链表或数组);4、词法分析中源程序的输入以.c格式,分析后的符号表,将二元组保存在.txt文件中。3.课程设计的主要设计思想1、算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号;2、其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。二总体方案设计三详细设计1.关键字表的初值:关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:stringkey[32]={auto,double,int,struct,break,else,long,switch,case,enum,syn=47报错YNNYNNYYYYNN开始打开文件初始化文件指针识别指针内容文件是否结束结束是否为空格或换行指向下一字符是否为字母拼字母是否为数字是否为符号拼数是否为关键字syn=46syn为对应关键字的单词种别码对不同符号给出相应的种码值register,typedef,char,extern,return,union,const,float,short,unsigned,continue,for,signed,void,default,goto,sizeof,volatile,do,while,static,if};2.扫描子程序的设计:①str用来存放构成单词符号的字符串;②str用来整型单词;③ch用来存放单词符号的种别码。四程序的调试与运行结果说明设置初始值扫描输入子程序输出单词二元组(单词种别码)输入串扫描结束YN结束五课程设计总结词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,我对词法分析器有了进一步的了解,把理论知识应用于实验中。也让我重新熟悉了C语言的相关内容,加深了对C语言知识的深化和用途的理解。通过这次语义分析的实验,我对高级语言的学习有了更深的认识,了解得更透彻。我了解了高级语言转化为目标代码或汇编指令的过程,。对今后的学习将起很大的作用,对以后的编程有很大的帮助.本次实验虽然只是完成了一个简单的程序,并且程序的主要框架课本上有给出,但在组织程序结构和深入了确上学到了很多,加深对编译原理的理解,掌握编译程序的实现方法和技术。巩固了前面所学的知识。六后记七附录#includeiostream#includestdio.h#includefstream#includestring#includestdlib.h#includectype.husingnamespacestd;#defineMAX32charch='';stringkey[32]={auto,double,int,struct,break,else,long,switch,case,enum,register,typedef,char,extern,return,union,const,float,short,unsigned,continue,for,signed,void,default,goto,sizeof,volatile,do,while,static,if};intIskey(stringc){//关键字判断inti;for(i=0;iMAX;i++){if(key[i].compare(c)==0)returni+1;}return47;}intIsLetter(charc){//判断是否为字母if(((c='z')&&(c='a'))||((c='Z')&&(c='A')))return1;elsereturn0;}intIsDigit(charc){//判断是否为数字if(c='0'&&c='9')return46;elsereturn0;}voidmain(){charin_fn[30],outfil[30];FILE*fpin,*fpon;cout请输入源文件名(包括路径和后缀名):\n;for(;;){cinin_fn;if((fpin=fopen(in_fn,r))!=NULL)break;elsecout文件路径错误!请输入源文件名(包括路径和后缀名):\n;}cout另存的文件名为outfil.txt\n;/*cinoutfil;//输入需要lingcun的文件名if((fpon=fopen(outfil,w))==NULL)//打开需要存入的文件{coutcannotopenfile\n;exit(0);}*/ofstreamoutfile(outfil,ios::out);cout\n********************分析如下*********************endl;cout\n单词***种别endl;outfile\n单词***种别endl;//analyse(fpin);//voidanalyse(FILE*fpin){stringstr=;//charstr[90];while((ch=fgetc(fpin))!=EOF){str=;if(ch==''||ch=='\t'||ch=='\n'){}elseif(IsLetter(ch)){while(IsLetter(ch)||IsDigit(ch))//关键字{if((ch='Z')&&(ch='A'))ch=ch+32;str=str+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);if(Iskey(str)){coutstr\t$Iskey(str)endl;outfilestr\t$Iskey(str)\n;}else{coutstr\t$47endl;outfilestr\t$47\n;}}elseif(IsDigit(ch)){while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin)))//标识符{str=str+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);coutstr\t$47endl;outfilestr\t$47\n;}elseswitch(ch)//字符{case'#':{coutch\t$48endl;outfilech\t$48\n;}break;case'-':{ch=fgetc(fpin);if(ch=='-'){cout--\t$80endl;outfilech\t$80\n;}else{cout-\t$79endl;outfilech\t$79\n;fseek(fpin,-1L,SEEK_CUR);}}break;case'*':{coutch\t$56endl;outfilech\t$56\n;}break;case'=':{coutch\t$63endl;outfilech\t$63\n;}break;case'/':{coutch\t$86endl;outfilech\t$86\n;}break;case'(':{coutch\t$49endl;outfilech\t$49\n;}break;case')':{coutch\t$50endl;outfilech\t$50\n;}break;case'[':{coutch\t$51endl;outfilech\t$51\n;}break;case']':{coutch\t$52endl;outfilech\t$52\n;}break;case';':{coutch\t$84endl;outfilech\t$84\n;}break;case'':{coutch\t$82endl;outfilech\t$82\n;}break;case'_':{coutch\t$85endl;outfilech\t$48\n;}break;case'{':{coutch\t$53endl;outfilech\t$53\n;}break;case'}':{coutch\t$54endl;outfilech\t$54\n;}break;case'%':{ch=fgetc(fpin);if(ch=='s'){cout%s\t$83endl;outfile%s\t$83\n;}if(ch=='d'){cout%d\t$71endl;outfile%d\t$83\n;}else{cout%\t$59endl;outfile%\t$59\n;fseek(fpin,-1L,SEEK_CUR);}}break;case'|':{ch=fgetc(