实验一词法分析器实验报告示例

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

其它其它字母初态字母012终态2数字E其它数字小数点数字终态其它数字+或-E数字小数点数字初态数字01324567词法分析器实验报告一.需求分析1.C语言关键字的子集,以文件形式保存,待判断的C语言语句以文件形式保存。2.关键字文件包括标识符、基本字、常数、运算符和界符以及相应的种别码。3.在计算机终端顺次输出各词法单位的种别码和值。若为标识符,其值为该标识符在标识符表中的位置;若为常数,其值为该常数在常数表中的位置;其余值为-1。非法输入单词的种别码为-1,值为-2。4.“单词”定义:C语言中最小的语法单位。“标识符”定义:用户自定义的标志符。5.测试数据:文本文件为unknowedword.text二.概要设计1.单词种别码设计如表一所示:表一.种别码设计种别码单词种别码单词种别码单词1for6++11)2if7--12=3else8+=13;4+9-=14标识符5-10(15实数2.单词规划的状态图:A标识符及关键字如图一所示:图一.标识符状态转换图B实数如图二所示:图二.实数状态转换图非=、+=+初态+012终态234C运算符如图三所示图三.运算符状态转换图D其它与运算符雷同,此处略3.数据结构know[N]用来存放构成单词符号的字符串;unknow[N]用来存放待辨别的字符串;chartab[T][N]用来存放识别出的标识符;keytab[M][N]用来存放从文件中读入的基本字;consttab[T]用来存放识别出的实数。以上均设为全局变量。4.基本操作Getchar()初始条件:unknow中读入了一串待辨别的字符串。操作结果:从unknow读入一个字符到ch中,指向unknow的指针加1。Getbc()初始条件:unknow中读入了一串待辨别的字符串。操作结果:从unknow中读入不是空格的下一个字符。Concat()初始条件:know中为字母且ch中为字母,或know中为数字(包括小数点)ch中也为数字。操作结果:将ch中的字符连接到know中。Isletter()初始条件:ch中已经读入了一个新的字符。操作结果:判断ch中的字符是否字母。Isdigit()初始条件:ch中已经读入了一个新的字符。操作结果:判断ch中的字符是否数字。Keyword()初始条件:已判断出know中的字符串为标识符。操作结果:判断know中的字符串单词是否关键字。Retract()初始条件:ch中的字符不能与know中的字符串组成可识别的单词。操作结果:将ch中的字符退回unknow中,ch为空格。Insertchar()初始条件:已判断出know中的字符串为非关键字的标识符。操作结果:将know中的字符串插入到标识符表chartab中。Insertconst()初始条件:已判断出know中的字符串为实数。操作结果:将know中的字符串插入到实数表consttab中。Aword(int&code)初始条件:ch中读入了新的字符。操作结果:判断unknow中指针当前位置开始的单词是否标识符。Real_number(int&code)初始条件:ch中读入了新的字符。操作结果:判断unknow中指针当前位置开始的单词是否实数。5.本程序包含的模块WordAnsis模块——实现对一个单词的识别功能。Main模块——调用词法分析器,分析文件unknowedword.text中所给出的程序。6.各模块间调用关系mainWordAnsis各基本操作三.详细设计程序源代码如下:#includestdio.h#includeconio.h#includestdlib.h#includestring.h#defineN10#defineM13#defineT5charch,know[N],unknow[N],chartab[T][N],keytab[M][N];floatconsttab[T],*pcos;char*puk,*pk,*pch;FILE*fkeywd,*funknw;voidGetchar(){ch=*puk;puk++;}voidGetbc(){while(ch=='')Getchar();}voidConcat(){*pk=ch;pk++;}intIsletter(){if(((ch64)&&(ch91))||((ch96)&&(ch123)))return1;elsereturn0;}intIsdigit(){if((ch47)&&(ch58))return1;elsereturn0;}intKeyword(){inti;for(i=0;iM;i++)if(strcmp(know,keytab[i])==0)returni+1;return14;}voidRetract(){ch='';puk--;}intInsertchar(){strcpy(pch,know);pch+=N;return(pch-chartab[0])/N;}intInsertconst(){inti,t,t1=-1,t2=-1,t3=-1;floatnum=(float)0.0,para=(float)0.1,temp=(float)0.0;for(i=0;iM;i++){if(know[i]=='.')t1=i;elseif((know[i]=='e')||(know[i]=='E'))t2=i;elseif(know[i]=='\0'){t3=i;break;}}if(t1!=-1)i=t1;elseif(t2!=-1)i=t2;elsei=t3;for(i--;i=0;i--){para*=10;num+=para*(know[i]-48);}if(t1!=-1){if(t2==-1)t=t3;elset=t2;para=1;for(i=t1+1;it;i++){para*=(float)0.1;num+=para*(know[i]-48);}}if(t2!=-1){if((know[t2+1]=='-')||(know[t2+1]=='+'))t=t2+2;elset=t2+1;para=(float)0.1;for(i=t3-1;i=t;i--){para*=10;temp+=para*(know[i]-48);}for(i=0,t=1;itemp;i++)t*=10;if(know[t2+1]=='-')num/=t;elsenum*=t;}*pcos=num;pcos++;returnpcos-consttab;}intAword(int&code)//若是标识符,返回值为该标识符在标识符表中的位置{while(Isletter()||Isdigit()||(ch=='_')){Concat();Getchar();}Retract();code=Keyword();if(code==14)returnInsertchar();elsereturn-1;}intReal_number(int&code)//若是实数,返回值为该实数在实数表中的位置{intt=0;while(Isdigit()){Concat();Getchar();t=1;}if(ch=='.'){Concat();Getchar();if((!Isdigit())&&(t==0)){printf(digiterror1\n);code=-1;Retract();return-2;}while(Isdigit()){Concat();Getchar();}}if((ch=='E')||(ch=='e')){Concat();Getchar();if((ch=='+')||(ch=='-')){Concat();Getchar();}if(!Isdigit()){printf(digiterror2\n);code=-1;return-2;}while(Isdigit()){Concat();Getchar();}}Retract();code=15;returnInsertconst();}intWordAnsis(int&code){inti;for(i=0;iN;i++)know[i]='\0';pk=know;Getchar();Getbc();if(ch=='+'){Getchar();if(ch=='+'){code=6;return-1;}elseif(ch=='='){code=8;return-1;}else{Retract();code=4;return-1;}}elseif(ch=='-'){Getchar();if(ch=='-'){code=7;return-1;}elseif(ch=='='){code=9;return-1;}else{Retract();code=5;return-1;}}elseif(ch=='('){code=10;return-1;}//elseif(ch==')'){code=11;return-1;}elseif(ch=='='){code=12;return-1;}elseif(ch==';'){code=13;return-1;}elseif(Isletter()){returnAword(code);}elseif(Isdigit()||(ch=='.')){returnReal_number(code);}else{printf(inputerror\n);code=-1;return-2;}}voidmain(){inti,t,code,value;{if((fkeywd=fopen(keyword.txt,r))==NULL){printf(Cann'topenkeywordfile!);exit(1);}}{if((funknw=fopen(unknowedword.txt,r))==NULL){printf(Cann'topenunknowedwordfile!);exit(1);}}for(i=0;iM;i++){fscanf(fkeywd,%s%d,&keytab[i],&t);if(keytab[i][0]=='')break;}fscanf(funknw,%s,&unknow);puk=unknow;pch=chartab[0];pcos=consttab;for(;(puk(unknow+N))&&((*puk)!='\0');){value=WordAnsis(code);printf(Thecodeis%d,thevalueis%d\n,code,value);}fclose(fkeywd);fclose(funknw);getch();}四.调试分析1.编程时将各个基本功能用函数来实现使得程序的条理性增强了,全局变量的使用也使得数据在函数间的传递更加方便。2.词法分析器中if——else的使用有些繁琐,暂时还没有找到更好的解决方法。3.整个编程过程中除了一些简单的语法和逻辑错误外,没有太大的问题。五.用户手册1.本程序的运行环境为DOS操作系统,执行文件为:词法分析器.exe2.用户可通过将需要识别的程序段放入文件unknowedword.txt中,打开词法分析器.exe可看到运行结果。3.本程序的目的是识别单词,函数WordAnsis即用户所需,主函数仅用于测试该函数的正确性。六.测试结果1.测试数据:for(i=3.5e2)运行结果:2.测试数据:for(*10)运行结果:七.附录源程序文件名清单:词法分析器.cpp//主程序文件Keyword.txt//关键字及其种别码文件Unknowedword//待识别程序文件出师表两汉:诸葛亮先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。宫中府中,俱为一体;陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功