词法分析实验报告.doc_第1页
词法分析实验报告.doc_第2页
词法分析实验报告.doc_第3页
词法分析实验报告.doc_第4页
词法分析实验报告.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编 译 原 理实验名称: 词法分析器班 级:计科0705姓 名: 郑 磊学 号:04071175 2010年4月29日 词法分析器一 实验目的要求 用C语言编写一个词法分析器,使之能识别输入串,并把分析结果(单词符号,标识符,关键字等等)输出。输入源程序,输出单词符号,本词法分析器可以辨别关键字,标识符,常数,运算符号,逻辑符号和某些界符,运用了文件读入来获取源程序代码,再对该源程序代码进行词法分析,逐个识别出其中的单词,并将其转换为内部编码形式的单词符号串作确为输出。通常,可采用二元式 (value,class) 来表示一个单词符号的内部编码,其中:class为一类型码,用于表示该单词的类别;value则是该单词之值。二 单词分类表将单词分为五类: 1.:保留字 2:标识符 3:数字符 4:运算符 5:界符 1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。2.本程序我们自行规定(即单词分类表):(1)关键字:auto,double,union,int,struct,break,else,long,switch,case,enum,register,typedef,char,extern, return,const,float,short,unsigned,continue,for,signed,void,default,goto,sizeof, volatile,do,while,static,if;运算符: +,-,*,/,=界符: ,;,(,),.,#(4)其他标记 如字符串,表示以字母开头的标识符。(5)空格、回车、换行符过滤。在屏幕上显示如下: =1 保留字 =2 标识符 =3 数字符 =4 运算符 =5 界符三单词状态图 标识符 不存在时存入 空白 字母或数字 O O 字母 保留字 已存在开始 O 数字 数字 非数字字母小数点 小数点报错 O 数字 O 小数点 数字 非数字字母小数点 O =号 字母报错 字母报错O O O=号 非=号(*/状态与=相同) =号 O O +号 非+号=号 /号 O (- 状态与+相同) O ,等界符 +号 *号 *号 /号 O O O /号 非/或* 非/号 非t,n,r,f O O 号 t或n或r或f (号 O (号计数 匹配 O )号 )号计数 不匹配出错 (中括号大括号状态与小括号相同) O四算法描述 由主程序main()先调入index()函数进入主界面,用户根据提示输入要进行词法分析的文件,然后进入analysis()函数调入用户输入的文件进行分析。当所读入的文件不为空时开始分析,1:进行注释判断,将注释消除 2:过滤空格及判断出的注释符 3:判断标识符和保留字 4:判断数字 5:判断运算符和界符(同时进行括号匹配)6:在各部分中增加相对的错误提示 7:将结果输出到界面以及相应的out.txt 。五程序结构#define Baoliuzi 1#define Biaoshifu 2#define Shuzifu 3#define Yunsuanfu 4#define Jiefu 5int main() int analysis() /*用来实现:读写文件,判断注释,对空格进行过滤 ,判断注释符,判断标识符和保留字,判断是数字,判断是运算符或者是界符,判断括号匹配。*/int letterjudge(char ch) /判断一个字符是否是字母int numberjudge(char ch) /判断一个字符是否是数字六运行调试结果 通过运行调试,初步实现所需功能,报错功能仍有较大空间提高七个人在词法分析器中的任务 我在里面负责判断标识符,保留字,数字。int letterjudge(char ch);int numberjudge(char ch); 并且参与程序整体的维护和构架,以及几大模块之间的衔接。在标识符和保留字中,充分利用文件的一些操作和程序。在数字判断方面考虑到数字的类型,分类进行处理,最后的判断输出到文件out.txt中。八设计技巧及体会 进行词法分析器之前,现在网上参考了一些分析器的设计思路,从而确定了自己的设计方向,开始设计完成后仅仅是不到二百行的一个简易程序,通过观察老师检查别的设计小组时提出的问题,发现自己的程序仍存在很大的缺陷,例如:没有报错,无法消除注释和注释符,相同的标识符在输出文件中重复出现。通过全组人员不断的修改调试以及运行结果检测,程序的应用性有了很大的提高。 通过这次程序设计,加强了我与人配合共同完成一个程序的合作经验,并且更加清楚明白了许多程序设计时需要注意到的细节问题,熟悉了程序语言及构造词法分析器的原理,总之,这次试验让我受益匪浅。 (注:源程序清单请见电子版,稍后附上) (组员:(1)组长:赵楠(2)郑磊(3)孙龙飞)总体代码如下:#include #include #include #define Baoliuzi 1#define Biaoshifu 2#define Shuzifu 3#define Yunsuanfu 4#define Jiefu 5char *baoliuzi32=auto,double,union,int,struct,break,else,long,switch,case,enum,register,typedef,char,extern, return,const,float,short,unsigned,continue,for,signed,void,default,goto,sizeof, volatile,do,while,static,if;char *yunsuanfu5=+,-,*,/,=;char *jiefu10=,;,(,),.,#; /函数声明int analysis();int letterjudge(char ch);int numberjudge(char ch);void index()printf(ntt=*欢迎使用词法分析器*=n);printf(nttt);printf(ntttt);printf(nttt);printf( t #本词法分析器可为您分析出# n);printf(n);printf(n);printf(n);printf( tt =1 保留字n);printf( tt =2 标识符n);printf( tt =3 数字符n);printf( tt =4 运算符n);printf( tt =5 界符n);printf(nt);printf(n); printf(n);/* int analysis()/词法分析程序算法 int i=0,k=0; /k用来表示标识符存储下标int sBracketL=0,sBracketR=0,mBracketL=0,mBracketR=0,bBracketL=0,bBracketR=0; /括号匹配char ch; char name20;char save2020=0; /用来存储标识符FILE *fpin;FILE *fpout; /文件操作 printf(ntt=词法分析器=n); printf(nntt请输入需要分析的文件的文件名:); scanf(%s,&name); if(fpin=fopen(name,r)=NULL)printf (t无法打开文件,请重新查看!n); return(1);if(fpout=fopen(out.txt,w+)=NULL)printf (t无法打开文件,请重新查看!n); return(1); printf(ntt=词法分析开始=n); ch=fgetc(fpin); /获取文件的第一个字符 /对读取进来的字符进行判断while(ch!=EOF) int a,b,c; char buffer20=0; /暂时存储从文件读来的字符并且对buffer进行清空 if(ch=EOF) /判断文件是否为空 fclose(fpin); fclose(fpout); /*判断注释if(ch=/)ch=fgetc(fpin);if(ch=/) /消除注释符/后的注释 while(ch!=n) ch=fgetc(fpin);ch=fgetc(fpin);continue;else if(ch=*) int flag=0; ch=fgetc(fpin); while(flag!=2) /当扫描到*且紧接着下一个字符为/才是注释的结束 flag=0; while(ch!=*) ch=fgetc(fpin); flag+; ch=fgetc(fpin); if(ch=/) flag+; else ch=fgetc(fpin); else /若为除号写入输出文件buffer0=ch; printf(nt%s是运算符n,buffer); fprintf(fpout,(%i,%s)n,Yunsuanfu,buffer); /输出到文件 break; ch=fgetc(fpin);continue; /*对空格进行过滤 if(ch=09|ch=10|ch=12|ch=13|ch= ) ch=fgetc(fpin); /获取文件的下一个字符 /*判断注释符 if(ch=) ch=fgetc(fpin);switch(ch) case n: ; / n 回车换行 10 case t: ; / t 横向跳到下一制表位置 9 case r: ; / r 回车 13 case f: ; / f 走纸换页 12 default: ; ch=fgetc(fpin);continue; a=letterjudge(ch); / a表示字母函数的返回值 b=numberjudge(ch); / b表示数字函数的返回值 /*判断标识符和保留字 if(a=1) /下一个字符为字母 int r1,r2; int j=0; while(a) int m,n; m=letterjudge(ch); / a表示字母函数的返回值 n=numberjudge(ch); / b表示数字函数的返回值 if(m=1|n=1) bufferj=ch; ch=fgetc(fpin); j+; else break; for(i=0;i32;i+) r1=strcmp(baoliuzii,buffer); /将字符串同保留字串相对比 if(r1=0) printf(nt%s是保留字n,buffer); /输出到界面上 fprintf(fpout,(%i,%s)n,Baoliuzi,buffer); /输出到文件 break; if(r1!=0) for(i=0;i1) /出现一次以上的小数点则报错 printf(nt数字串中存在一个以上小数点,出错!按任意键退出修改源文件!n); getchar(); getchar(); exit (1);else bufferj=ch;j+;ch=fgetc(fpin); /如果是一个小数点则继续读下一个数字 printf(nt%s是数字n,buffer); fprintf(fpout,(%i,%s)n,Shuzifu,buffer); /输出到文件 continue; /*判断是运算符或者是界符 else int r1,r2; char ch1;buffer0=ch; /判断是运算符 for(i=0;i5;i+) r1=strcmp(yunsuanfui,buffer); if(r1=0) if(ch=+)ch1=fgetc(fpin);if(ch1=+) /判断+符号buffer1=ch1;printf(nt%s是运算符n,buffer); fprintf(fpout,(%i,%s)n,Yunsuanfu,buffer); /输出到文件 break;else if(ch1=) /判断+=符号buffer1=ch1;printf(nt%s是运算符n,buffer); fprintf(fpout,(%i,%s)n,Yunsuanfu,buffer); /输出到文件 break;else /否则输出运算符+printf(nt%s是运算符n,buffer); fprintf(fpout,(%i,%s)n,Yunsuanfu,buffer); /输出到文件 break;else if(ch=-)ch1=fgetc(fpin);if(ch1=-) /判断-符号buffer1=ch1;printf(nt%s是运算符n,buffer); fprintf(fpout,(%i,%s)n,Yunsuanfu,buffer); /输出到文件 break;else if(ch1=) /判断-=符号buffer1=ch1;printf(nt%s是运算符n,buffer); fprintf(fpout,(%i,%s)n,Yunsuanfu,buffer); /输出到文件 break;else /否则输出运算符-printf(nt%s是运算符n,buffer); fprintf(fpout,(%i,%s)n,Yunsuanfu,buffer); /输出到文件 break;else ch1=fgetc(fpin); /判断*=,/=,=if(ch1=) buffer1=ch1;printf(nt%s是运算符n,buffer); fprintf(fpout,(%i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论