C语言词法分析器源代码风君版_第1页
C语言词法分析器源代码风君版_第2页
C语言词法分析器源代码风君版_第3页
C语言词法分析器源代码风君版_第4页
C语言词法分析器源代码风君版_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、#include #include *keyOF#include char,auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,sho rt,signed,sizeof,static,struct,switch,typedef,_Complex,_Imaginar y,union,unsigned,void,volatile,while;/* 保留字表 */ char *key1= ,(,),;,;/* 分隔符表 */c

2、har*key2F,+,-,*,/,%,JJJJ 1 J 7 u 5JJ,=,=,!=,!,&,|,JJ,J | | JJJJA & 一 ?+ + +一 一 *一 /=; /* 运算符表 */ int xx035 , xx110 , xx231;int temp_key3=0,temp_c40=0,temp_c4 仁 0,temp_c42=0,temp_c43=0;初始化函数*/void load()int mm;for (mm=0;mm=34;mm+)xx0mm=0;for (mm=0;mm=9;mm+)xx1mm=0;for (mm=0;mm=30;mm+)xx2mm=0;FILE *fl

3、oading;if (floadi ng一fope n(keyO.txt,w)一一NULL)printf(Error! Cant create file : key0.txt); return;fclose (floading);/* 建立保留字表文件: key0.txt*/if (floading=fopen(key1.txt,w)=NULL)printf(Error! Cant create file : key1.txt); return;/* 建立分隔符表文件: key1.txt*/if (floading=fopen(key2.txt,w)=NULL)printf(Error! Ca

4、nt create file : key2.txt); return;fclose(floading);/* 建立运算符表文件: key2.txt*/if (floading=fopen(key3.txt,w)=NULL)printf(Error! Cant create file : key3.txt); return;fclose (floading);/* 建立标识符表文件: key3.txt*/if (floading=fopen(c40.txt,w)=NULL)printf(Error! Cant create file : c40.txt); return;fclose (floa

5、ding);/* 建立整数类型常量表文件: c40.txt*/if (floading=fopen(c41.txt,w)=NULL)printf(Error! Cant create file : c41.txt); return;fclose (floading);/* 建立浮点类型常量表文件: c41.txt*/if (floading=fopen(c42.txt,w)=NULL)printf(Error! Cant create file : c42.txt); return;fclose (floading);/* 建立字符类型常量表文件: c42.txt*/if (floading=

6、fopen(c43.txt,w)=NULL)printf(Error! Cant create file : c43.txt); return;fclose (floading);/* 建立字符串类型常量表文件: c43.txt*/if (floading=fopen(defination.txt,w)=NULL)printf(Error! Cant create file : defination.txt); return;fclose (floading);/* 建立注释文件: defination.txt*/if (floading=fopen(output.txt,w)=NULL)pr

7、intf(Error! Cant create file : output.txt); return;fclose (floading);/* 建立内部码文件: output.txt*/if (floading=fopen(temp_key1,w)=NULL)printf(Error! Cant create file : temp_key1); return;fclose (floading);/* 建立保留字临时表文件: temp_key1*/if (floading=fopen(temp_key3,w)=NULL)printf(Error! Cant create file : temp

8、_key3); return;fclose (floading);/* 建立标识符临时文件: temp_key3*/if (floading=fopen(temp_c40,w)=NULL)printf(Error! Cant create file : temp_c40); return;fclose (floading);/* 建立整数类型常量临时文件: temp_c40*/if (floading=fopen(temp_c41,w)=NULL)printf(Error! Cant create file : temp_c41); return;fclose (floading);/* 建立

9、浮点类型常量临时文件: temp_c41*/ if (floading=fopen(temp_c42,w)=NULL)printf(Error! Cant create file : temp_c42);return;fclose (floading);/* 建立字符类型常量临时文件: temp_c42*/ if (floading=fopen(temp_c43,w)=NULL) printf(Error! Cant create file : temp_c43);return;fclose (floading);/* 建立字符串类型常量临时文件: temp_c43*/ /* 保留字及标识符判

10、断函数 */void char_search(char *word)int m,line=0,csi=0;int value=0;int value2=0;char c,cs100;FILE *foutput,*finput;for (m=1;m=34;m+)if (strcmp(word,key0m)=0)value=1;break;if (value=1)if (xx0m=0)foutput=fopen(key0.txt,a); fprintf(foutput,0t%dtt%sn,m,word); fclose(foutput);xx0m=1;foutput=fopen(output.tx

11、t,a);fprintf(foutput,0t%dtt%sn,m,word);fclose(foutput);elseif (temp_key3=0)foutput=fopen(temp_key3,a); fprintf(foutput,%sn,word); fclose(foutput);temp_key3+;foutput=fopen(key3.txt,a);fprintf(foutput,3t1tt%sn,word); fclose(foutput);finput=fopen(temp_key3,r);c=fgetc(finput);while (c!=EOF)while (c!=n)c

12、scsi+=c; c=fgetc(finput);cscsi=0;csi=0;line+;if (strcmp(cs,word)=0)value2=1;break;elsevalue2=0; c=fgetc(finput);fclose(finput);if (value2=1)foutput=fopen(output.txt,a);fprintf(foutput,3t%dtt%sn,line,word); fclose(foutput);else foutput=fopen(temp_key3,a); fprintf(foutput,%sn,word); fclose(foutput); t

13、emp_key3+; foutput=fopen(output.txt,a); fprintf(foutput,3t%dtt%sn,temp_key3,word); fclose(foutput);foutput=fopen(key3.txt,a); fprintf(foutput,3t%dtt%sn,temp_key3,word); fclose(foutput);/* 整数类型判断函数 */void inta_search(char *word)FILE *foutput,*finput;char c;char cs100;int csi=0;int line=0;int value2=0

14、;if (temp_c40=0)foutput=fopen(temp_c40,a); fprintf(foutput,%sn,word);fclose(foutput); temp_c40+;foutput=fopen(c40.txt,a); fprintf(foutput,4t0t1t%sn,word); fclose(foutput); finput=fopen(temp_c40,r); c=fgetc(finput); while (c!=EOF)while (c!=n)Mlndlno4oso_o4MPOM七-anduu=oso_o4宀-anduu=Qo6T。宀三Eq-Lucxl nro

15、(0upOM-so)dEOls)七+ u=O.LS。_ Ob一s。一 s。宀 -andu_4)oo6ToQ+土 so一 s。O.LS。茎一-00 匸 soelpQElp Andurlndlnor-山 J 匚 (POM*elp)lloe slu 一 po 懸国B冢尉絲 lu-o$u=c一O.LS。lu-00 匸 soelpQElp Andurlndlnor-山 J 匚 (POM*elp)lpe SI。po* 懸国B冢呱(nFe*Mlndlno4oso_o4eOM-Ltoldlu9-=ss%AP%Awindlno4u_d4 Fe=-=pqo芸=)u dorlndlnoAMlndlno4oso_o4

16、 eOM-Ltoldlu9-=ss%AP%Awindlno4u_d4Fe=cxnndlno=)u dorlndln-LUCXI nro(0upOM-so)dEOls)七+ u=O.LS。_ Ob一S。一 s。 宀-andu_4)oo6ToQ+土 so一 s。(-ubl!.。) gllM(do 山I!.。)壬 m-anduu=Qo6T。 -(=-寸0ldlu9=)u dorlndujj 宀Mlndlno4oso_o4 MP0M-=ss%=5$2=ndln04u_d4 FB-cxre 芸=)u dorlndln匸+g 寸 0ldlu9Mlndlno4oso_o4 eOM-=ss%=ndlno4=l

17、u_d4 M=e=-=e 寸0ldlu9=)u dorlndlnoAMPOM-=ss%=l40M7=ndlno4u_d4Fe=-=pqcxl芸=)u dorlndln-+ldlu9Mlndlno4oso_o4 eOM-=ss%=ndlno4=lu_d4 寸0ldlu9=)u dorlndlnoA(0UUEIduJ9)七OHCXI nro lu-o$u=c一O.LS。lu-00 匸 soelpQElp Andurlndlnor-山 J 匚 (POM*elp)lpees。po*Mlndlno4oso_o4eOMo芸 ldlu9-=ss%AP%A$2一寸=ndln04=lu_d4Fe=-=pq芸=)

18、u dorlndlnMlndlno4oso_o4 eOMo芸 ldlu9-=ss%AP%A$2一寸=ndln04=lu_d4Fe=cxnndlno=)u dorlndln匸+g 寸 0ldlu9Mlndlno4oso_o4 eOM-=ss%=ndlno4=lu_d4M=e=-=e 寸0ldlu9=)u dorlndlnoA so宀Mlndlno4oso_o4MP0M(Du=-=ss%AP%A$2=ndln04u_d4Fe=cxnndlno=)u dorlndln(UHCXI n_e七-anduu=oso_o4宀-anduu=Qo6T。宀三Eq-anduu=Qo6T。宀三Eq-LUCXI nro

19、(0upOM-so)dEOls)七+ u=O.LS。_ Ob一S。一 s。 宀-andu_4)oo6ToQ+土 so一 s。(-ubl!.。) gllM(do 山I!.。)壬 m-anduu=Qo6T。-(=-&寸0ldlu9=)u dorlndujj宀Mlndlno4oso_o4*Mlndlno4oso_o4 eOM7toldlu9-=ss%AP%10=ndlno4u_d4Fe=-=pqcxl芸=)u dorlndlnMlndlno4oso_o4 eOM7toldlu9-=ss%AP%10=ndlno4u_d4Fe=cxnndlno=)u dorlndln -+ldlu9Mlndlno4os

20、o_o4 eOM-=ss%=ndlno4=lu_d4 寸0ldlu9=)u dorlndlnoA so 宀Mlndlno4oso_o4MPOM(Du=-=ss%AP%10=ndlno4u_d4Fe=cxnndlno=)u dorlndln(UHCXI n_e七 -anduu=oso_o4void scan()int count; char chin;FILE *fin;FILE *fout; char filename50; char temp100;char target3=; printf( 请输入文件名: ); scanf(%s,filename);if (fin=fopen(filen

21、ame,r)=NULL)printf(Error! Cant open file : %sn,filename); return; chin=fgetc(fin); while (chin!=EOF)/* 对文件包含、宏定义进行处理 */ if (chin=#) while (chin!=) chin=fgetc(fin);/*chin=fgetc(fin);*/* 对空格符、水平制表符进行处理 */ else if (chin= )|(chin=t) /* 对回车符进行处理 */else if (chin=n)J/* 对单引号内的字符常量进行处理 */ else if (chin=targe

22、t0)if (xx19=0)fout=fopen(key1.txt,a);fprintf(fout,1t9tt%cn,target0);fclose(fout); xx19=1; temp0=chin; chin=fgetc(fin); temp1=chin; chin=fgetc(fin);if (chin!=target0) temp2=chin; chin=fgetc(fin); temp3=chin; temp4=0;else temp2=chin; temp3=0; c_search(temp);/* 对双引号内的字符串常量进行处理 */ else if (chin=)int i=0

23、;tempi+=; chin=fgetc(fin); while (chin!=) tempi+=chin; chin=fgetc(fin);tempi=;tempi+1=0; cc_search(temp);/* 对保留字、标识符进行处理 */ifelse (chin=A)&(chin=a)&(chin=A)&(chin=a)&(chin=0 )&(chin=0)&(chin=0)&(chin=9)|(chin=.)if (chin=.)dotcount+;if (dotcount=2)break;tempi+=chin;chin=fgetc(fin);tempi=0;if (dotcoun

24、t=1)intb_search(temp);elseinta_search(temp);if (chin!=EOF)fseek (fin,-1L,SEEK_CUR);/* 对注释进行处理 */else if (chin=/)chin=fgetc(fin);if (chin=)fout=fopen(output.txt,a); fprintf(fout,2t30tt/=n); fclose(fout);else if (chin!=*)fout=fopen(output.txt,a);fprintf(fout,2t4tt/n); fclose(fout); fseek(fin,-1L,SEEK_

25、CUR);else if (chin=*)count=0;chin=fgetc(fin); fout=fopen(defination.txt,a); fprintf(fout,/*);while (count!=2)count=0;while (chin!=*)fprintf(fout,%c,chin); chin=fgetc(fin);count+; fprintf(fout,%c,chin); chin=fgetc(fin);if (chin=/)count+; fprintf(fout,%cn,chin);elsefprintf(fout,%c,chin); chin=fgetc(fi

26、n);/* 对运算符、分隔符进行处理 */elseint time=0;int firstblood=0;temp0=chin;chin=fgetc(fin);if (chin!=EOF)temp1=chin;temp2=0;for (time=1;time=30;time+)if (strcmp(temp,key2time)=0)firstblood=1;if (xx2time=0) fout=fopen(key2.txt,a); fprintf(fout,2t%dtt%sn,time,temp); fclose(fout);xx2time=1;fout=fopen(output.txt,a

27、); fprintf(fout,2t%dtt%sn,time,temp); fclose(fout);break;if (firstblood!=1)fseek(fin,-1L,SEEK_CUR);temp1=0;for (time=1;time=9;time+)if (strcmp(temp,key1time)=0)if (xx1time=0)fout=fopen(key1.txt,a); fprintf(fout,1t%dtt%sn,time,temp); fclose(fout);xx1time=1; fout=fopen(output.txt,a); fprintf(fout,1t%d

28、tt%sn,time,temp); fclose(fout);break;for (time=1;time查看保留字表文件*n);printf(* 1 -查看分隔符表文件*n);printf(* 2 -查看运算符表文件*n);printf(* 3 -查看标识符表文件*n);printf(* 4 -查看整数类型常量表*n);printf(* 5 -查看浮点类型常量表*n);printf(* 6 -查看字符类型常量表*n);printf(* 7 -查看字符串类型常量表*n);printf(* 8 -查看注释文件*n);分析工printf(* 9 -printf(* printf(* Q -查看内部

29、码文件退出*n);*n);*n);printf(*n);printf(n);load();scan();printf(n);printf( 分析完成! n); getchar();printf(n);printf( 请输入命令: ); command=getchar();while (command!=Q)&(command!=q) switch (command)*n);printf(case 0:printf(*n);printf(n);fread=fopen(key0.txt,r);charin=fgetc(fread);while (charin!=EOF)putchar(charin

30、);charin=fgetc(fread);printf(n);printf(*n);printf(n);printf( 请输入命令: );case 1:break;H*printf(n);fread=fopen(key1.txt,r);charin=fgetc(fread);while (charin!=EOF)putchar(charin);charin=fgetc(fread);printf(n);*n);printf( printf(n);printf( 请输入命令: ); break;case 2:printf(*n);printf(n);fread=fopen(key2.txt,r

31、);charin=fgetc(fread);while (charin!=EOF)putchar(charin);charin=fgetc(fread); printf(n);printf(H*n);printf(n);printf( 请输入命令: );break;case 3:printf(H*n);printf(n);fread=fopen(key3.txt,r); charin=fgetc(fread);while (charin!=EOF)putchar(charin);charin=fgetc(fread); printf(n);printf(H*n);printf(n);printf( 请输入命令: );break;case 4:H*printf(*n);case 5:case 6:printf(n);fread=fopen(c40.txt,r); charin=fget

温馨提示

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

评论

0/150

提交评论