词法分析器文档_第1页
词法分析器文档_第2页
词法分析器文档_第3页
词法分析器文档_第4页
词法分析器文档_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、词法分析程序文档说明:该词法分析器实现对C语言源代码进行词法分析的功能,由文件输入,将输入的源代码输出为token序列,用二元组形式由文件和屏幕输出,文件输出首先输入源文件路径和文件名称,将注释过滤,能够报告不合法字符,并且记录源代码的行数,单词数(包括关键字,标识符和常量)和字符数(包括字母,数字,标点符号,运算符,空格和换行符)。程序设计:具体见源代码源代码:#include <stdio.h>#include <string>#include <iostream>#include <cstdlib>using namespace std;#

2、define MAX 32char ch =' 'int line=1,zifu=1,word=0;/*line记录行数zifu记录字符数(包括字母,数字,标点符号,运算符,空格和换行符)word记录单词数(包括关键字,标识符和常量)*/ string key32= "auto","break","case","char","const","continue","default","do","double&qu

3、ot;, "else","enum","extern","float","for","goto","if","int","long","register", "return","short","signed","sizeof","static","struct","sw

4、itch","typedef", "union","unsigned","void","volatile","while" ;/c语言中的所有关键字int Iskey(string c) /关键字判断 int i; for(i=0; i<MAX; i+) if(pare(c)=0) /将字符串与关键字一一进行比较 return 1; return 0;int IsLetter(char c) /判断是否为字母 if(c<='z&#

5、39;)&&(c>='a')|(c<='Z')&&(c>='A') return 1; else return 0;int IsDigit(char c) /判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0;void analyse(FILE *fpin,FILE *fpout) string arr=""string str="" while(c

6、h=fgetc(fpin)!=EOF) zifu+;/将文件中的字符逐一进行扫描,包括字母,数字,标点符号,运算符,空格和换行符 arr="" if(IsLetter(ch)/对开头是字母或数字的字符串进行判断 while(IsLetter(ch)|IsDigit(ch)|ch='_')/符合标识符或者关键字标准的字符串进行判断 if(ch<='Z')&&(ch>='A') ch=ch+32; arr=arr+ch;/将每个单个读取的字符连成字符串 ch=fgetc(fpin); fseek(fpi

7、n,-1L,SEEK_CUR);/不满足条件的多读取的字符回退一格 if (Iskey(arr)/判断字符串是否是关键字 fprintf(fpout,"(%s %s)n",arr.c_str(),"key"); printf("(%s %s)n",arr.c_str(),"key");word+; else/字符串不是关键字则判定为标识符 fprintf(fpout,"(%s %s)n",arr.c_str(),"id"); printf("(%s %s)n&quo

8、t;,arr.c_str(),"id");word+; else if(IsDigit(ch)/开头为数字的串即为常量 while(IsDigit(ch)|ch='.'&&IsDigit(fgetc(fpin) arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); fprintf(fpout,"(%s %s)n",arr.c_str(),"num"); printf("(%s %s)n",arr.c_str(),"num

9、");word+; else switch(ch)/既不是数字也不是字母的符号判定 case'+': ch=fgetc(fpin);/判定+,+=,+ if(ch='+') fprintf(fpout,"(%s %s)n","+","-"); printf("(%s %s)n","+","-");zifu+; if(ch='=') fprintf(fpout,"(%s %s)n","+=&

10、quot;,"-"); printf("(%s %s)n","+=","-");zifu+; else fprintf(fpout,"(%s %s)n","+","-"); printf("(%s %s)n","+","-"); fseek(fpin,-1L,SEEK_CUR); break; case'-' : ch=fgetc(fpin); if(ch='-')

11、/判定-,-=,- fprintf(fpout,"(%s %s)n","-","-"); printf("(%s %s)n","-","-");zifu+; if(ch='=') fprintf(fpout,"(%s %s)n","-=","-"); printf("(%s %s)n","-=","-");zifu+; else fprint

12、f(fpout,"(%s %s)n","-","-"); printf("(%s %s)n","-","-"); fseek(fpin,-1L,SEEK_CUR); break; case'*' : fprintf(fpout,"(%s %s)n","*","-"); printf("(%s %s)n","*","-"); break; ca

13、se'=' : ch=fgetc(fpin);/判定=,= if(ch='=') fprintf(fpout,"(%s %s)n","=","-"); printf("(%s %s)n","=","-");zifu+; else fprintf(fpout,"(%s %s)n","=","EQ"); printf("(%s %s)n","=",&

14、quot;EQ"); fseek(fpin,-1L,SEEK_CUR); break; case'/' : ch=fgetc(fpin);/判定是注释还是运算符/ if(ch='*')/形如/* */的注释,将注释过滤 zifu-; ch=fgetc(fpin); while(ch!='*')&&(ch=fgetc(fpin)='/') ; else if(ch='/')/形如/的注释,将注释过滤 zifu-; ch=fgetc(fpin); while(ch!='n')

15、ch=fgetc(fpin);line+; else fprintf(fpout,"(%s %s)n","/","-"); printf("(%s %s)n","/","-"); fseek(fpin,-1L,SEEK_CUR); break; case '%': fprintf(fpout,"(%s %s)n","%","-"); printf("(%s %s)n","

16、%","-"); break; case '#': fprintf(fpout,"(%s %s)n","#","-"); printf("(%s %s)n","#","-"); break; case '!': ch=fgetc(fpin);/判定!=还是! if(ch='=') fprintf(fpout,"(%s %s)n","!=","-&qu

17、ot;); printf("(%s %s)n","!=","-");zifu+; else fprintf(fpout,"(%s %s)n","!","-"); printf("(%s %s)n","!","-"); fseek(fpin,-1L,SEEK_CUR); break; case '|': ch=fgetc(fpin); if(ch='|')/判定|还是| fprintf(

18、fpout,"(%s %s)n","|","-"); printf("(%s %s)n","|","-");zifu+; else fprintf(fpout,"(%s %s)n","|","-"); printf("(%s %s)n","|","-"); fseek(fpin,-1L,SEEK_CUR); break; case '&

19、9;: ch=fgetc(fpin); if(ch='&')/判定&&还是& fprintf(fpout,"(%s %s)n","&&","-"); printf("(%s %s)n","&&","-");zifu+; else fprintf(fpout,"(%s %s)n","&","-"); printf("(%s

20、 %s)n","&","-"); fseek(fpin,-1L,SEEK_CUR); break; case'(' : fprintf(fpout,"(%s %s)n","(","-"); printf("(%s %s)n","(","-"); break; case')' : fprintf(fpout,"(%s %s)n",")","

21、-"); printf("(%s %s)n",")","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-");

22、 printf("(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case'.' : fprintf(fpout,"(%s %s)n",".","-"); printf(

23、"(%s %s)n",".","-"); break; case',' : fprintf(fpout,"(%s %s)n",",","-"); printf("(%s %s)n",",","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("

24、(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case '"':fprintf(fpout,"(%s %s)n","引号","-"); printf("(%s

25、 %s)n","引号","-"); break; case '?': fprintf(fpout,"(%s %s)n","?","-"); printf("(%s %s)n","?","-"); break; case':' : fprintf(fpout,"(%s %s)n",":","-"); printf("(%s %s

26、)n",":","-"); break; case'>' : ch=fgetc(fpin); if(ch='=')/判定>=还是> fprintf(fpout,"(%s %s)n",">=","GE"); printf("(%s %s)n",">=","GE");zifu+; else fprintf(fpout,"(%s %s)n","

27、;>","GT"); printf("(%s %s)n",">","GT"); fseek(fpin,-1L,SEEK_CUR); break; case'<' : ch=fgetc(fpin);/判定<=还是<还是<> if(ch='=') fprintf(fpout,"(%s %s)n","<=","LE"); printf("(%s %s)n","<=","LE"); zifu+; else if(ch='>') fprintf(fpout,"(%s %s)n","<>","NE"); printf("(%s %s)n","<>","NE"); zifu+; else

温馨提示

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

评论

0/150

提交评论