C语言词法分析器 C语言 源代码.docx
C语言词法分析器 C语言 源代码#include <stdio.h>#include <string.h>#include <stdlib.h>char *key0=" ","auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","register","return","short","signed","sizeof","static","struct","switch","typedef","_Complex","_Imaginary","union","unsigned","void","volatile","while"/*保留字表*/char *key1=" ","(",")","","","","",",","","'"/*分隔符表*/char *key2=" ","+","-","*","/","%","<",">","=",">=","<=","!=","!","&&","|","<<",">>","","|","","&","=","?:","->","+","-",".","+=","-=","*=","/="/*运算符表*/int xx035,xx110,xx231;int temp_key3=0,temp_c40=0,temp_c41=0,temp_c42=0,temp_c43=0;/* 初始化函数 */void loadint 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 *floading;if (floading=fopen("key0.txt","w")=NULL)printf("Error! Can't create file : key0.txt");return;fclose (floading);/*建立保留字表文件:key0.txt*/if (floading=fopen("key1.txt","w")=NULL)printf("Error! Can't create file : key1.txt");return;/*建立分隔符表文件:key1.txt*/if (floading=fopen("key2.txt","w")=NULL)printf("Error! Can't create file : key2.txt");return;fclose(floading);/*建立运算符表文件:key2.txt*/if (floading=fopen("key3.txt","w")=NULL)printf("Error! Can't create file : key3.txt");return;fclose (floading);/*建立标识符表文件:key3.txt*/if (floading=fopen("c40.txt","w")=NULL)printf("Error! Can't create file : c40.txt");return;fclose (floading);/*建立整数类型常量表文件:c40.txt*/if (floading=fopen("c41.txt","w")=NULL)printf("Error! Can't create file : c41.txt");return;fclose (floading);/*建立浮点类型常量表文件:c41.txt*/if (floading=fopen("c42.txt","w")=NULL)printf("Error! Can't create file : c42.txt");return;fclose (floading);/*建立字符类型常量表文件:c42.txt*/if (floading=fopen("c43.txt","w")=NULL)printf("Error! Can't create file : c43.txt");return;fclose (floading);/*建立字符串类型常量表文件:c43.txt*/if (floading=fopen("defination.txt","w")=NULL)printf("Error! Can't create file : defination.txt");return;fclose (floading);/*建立注释文件:defination.txt*/if (floading=fopen("output.txt","w")=NULL)printf("Error! Can't create file : output.txt");return;fclose (floading);/*建立内部码文件:output.txt*/if (floading=fopen("temp_key1","w")=NULL)printf("Error! Can't create file : temp_key1");return;fclose (floading);/*建立保留字临时表文件:temp_key1*/if (floading=fopen("temp_key3","w")=NULL)printf("Error! Can't create file : temp_key3");return;fclose (floading);/*建立标识符临时文件:temp_key3*/if (floading=fopen("temp_c40","w")=NULL)printf("Error! Can't create file : temp_c40");return;fclose (floading);/*建立整数类型常量临时文件:temp_c40*/if (floading=fopen("temp_c41","w")=NULL)printf("Error! Can't create file : temp_c41");return;fclose (floading);/*建立浮点类型常量临时文件:temp_c41*/if (floading=fopen("temp_c42","w")=NULL)printf("Error! Can't create file : temp_c42");return;fclose (floading);/*建立字符类型常量临时文件:temp_c42*/if (floading=fopen("temp_c43","w")=NULL)printf("Error! Can't create file : temp_c43");return;fclose (floading);/*建立字符串类型常量临时文件:temp_c43*/* 保留字及标识符判断函数 */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.txt","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')cscsi+=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);elsefoutput=fopen("temp_key3","a");fprintf(foutput,"%sn",word);fclose(foutput);temp_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;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')cscsi+=c;c=fgetc(finput);cscsi='0'csi=0;line+;if (strcmp(cs,word)=0)value2=1;break;c=fgetc(finput);fclose(finput);if (value2=1)foutput=fopen("output.txt","a");fprintf(foutput,"4t0t%dt%sn",line,word);fclose(foutput);elsefoutput=fopen("temp_c40","a");fprintf(foutput,"%sn",word);fclose(foutput);temp_c40+;foutput=fopen("output.txt","a");fprintf(foutput,"4t0t%dt%sn",temp_c40,word);fclose(foutput);foutput=fopen("c40.txt","a");fprintf(foutput,"4t0t%dt%sn",temp_c40,word);fclose(foutput);/* 浮点类型判断函数 */void intb_search(char *word)FILE *foutput,*finput;char c;char cs100;int csi=0;int line=0;int value2=0;if (temp_c41=0)foutput=fopen("temp_c41","a");fprintf(foutput,"%sn",word);fclose(foutput);temp_c41+;foutput=fopen("c41.txt","a");fprintf(foutput,"4t1t1t%sn",word);fclose(foutput);finput=fopen("temp_c41","r");c=fgetc(finput);while (c!=EOF)while (c!='n')cscsi+=c;c=fgetc(finput);cscsi='0'csi=0;line+;if (strcmp(cs,word)=0)value2=1;break;c=fgetc(finput);fclose(finput);if (value2=1)foutput=fopen("output.txt","a");fprintf(foutput,"4t1t%dt%sn",line,word);fclose(foutput);elsefoutput=fopen("temp_c41","a");fprintf(foutput,"%sn",word);fclose(foutput);temp_c41+;foutput=fopen("output.txt","a");fprintf(foutput,"4t1t%dt%sn",temp_c41,word);fclose(foutput);foutput=fopen("c40.txt","a");fprintf(foutput,"4t1t%dt%sn",temp_c41,word);fclose(foutput);/* 字符串常量判断函数 */void cc_search(char *word)FILE *foutput,*finput;char c;char cs100;int csi=0;int line=0;int value2=0;if (temp_c43=0)foutput=fopen("temp_c43","a");fprintf(foutput,"%sn",word);fclose(foutput);temp_c43+;foutput=fopen("c43.txt","a");fprintf(foutput,"4t3t1t%sn",word);fclose(foutput);finput=fopen("temp_c43","r");c=fgetc(finput);while (c!=EOF)while (c!='n')cscsi+=c;c=fgetc(finput);cscsi='0'csi=0;line+;if (strcmp(cs,word)=0)value2=1;break;c=fgetc(finput);fclose(finput);if (value2=1)foutput=fopen("output.txt","a");fprintf(foutput,"4t3t%dt%sn",line,word);fclose(foutput);elsefoutput=fopen("temp_c43","a");fprintf(foutput,"%sn",word);fclose(foutput);temp_c43+;foutput=fopen("output.txt","a");fprintf(foutput,"4t3t%dt%sn",temp_c43,word);fclose(foutput);foutput=fopen("c43.txt","a");fprintf(foutput,"4t3t%dt%sn",temp_c43,word);fclose(foutput);/* 字符常量判断函数 */void c_search(char *word)FILE *foutput,*finput;char c;char cs100;int csi=0;int line=0;int value2=0;if (temp_c42=0)foutput=fopen("temp_c42","a");fprintf(foutput,"%sn",word);fclose(foutput);temp_c42+;foutput=fopen("c42.txt","a");fprintf(foutput,"4t2t1t%sn",word);fclose(foutput);finput=fopen("temp_c42","r");c=fgetc(finput);while (c!=EOF)while (c!='n')cscsi+=c;c=fgetc(finput);cscsi='0'csi=0;line+;if (strcmp(cs,word)=0)value2=1;break;c=fgetc(finput);fclose(finput);if (value2=1)foutput=fopen("output.txt","a");fprintf(foutput,"4t2t%dt%sn",line,word);fclose(foutput);elsefoutput=fopen("temp_c42","a");fprintf(foutput,"%sn",word);fclose(foutput);temp_c42+;foutput=fopen("output.txt","a");fprintf(foutput,"4t2t%dt%sn",temp_c42,word);fclose(foutput);foutput=fopen("c42.txt","a");fprintf(foutput,"4t2t%dt%sn",temp_c42,word);fclose(foutput);/* 主扫描函数 */void scanint count;char chin;FILE *fin;FILE *fout;char filename50;char temp100;char target3="'"printf("请输入文件名:");scanf("%s",filename);if (fin=fopen(filename,"r")=NULL)printf("Error! Can't 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');/*对单引号内的字符常量进行处理*/else if (chin=target0)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'elsetemp2=chin;temp3='0'c_search(temp);/*对双引号内的字符串常量进行处理*/else if (chin='"')int i=0;tempi+='"'chin=fgetc(fin);while (chin!='"')tempi+=chin;chin=fgetc(fin);tempi='"'tempi+1='0'cc_search(temp);/*对保留字、标识符进行处理*/else if (chin>='A')&&(chin<='Z')|(chin>='a')&&(chin<='z')|(chin='_')int i=0;while (chin>='A')&&(chin<='Z')|(chin>='a')&&(chin<='z')|(chin='_')|(chin>='0')&&(chin<='9')tempi+=chin;chin=fgetc(fin);tempi='0'char_search(temp);if (chin!=EOF)fseek (fin,-1L,SEEK_CUR);/*对整型、浮点型数据进行处理*/else if (chin>='0')&&(chin<='9')int dotcount=0;int i=0;while (chin>='0')&&(chin<='9')|(chin='.')if (chin='.')dotcount+;if (dotcount=2)break;tempi+=chin;chin=fgetc(fin);tempi='0'if (dotcount=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_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(fin);/*对运算符、分隔符进行处理*/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");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%dtt%sn",time,temp);fclose(fout);break;for (time=1;time<=30;time+)if (strcmp(temp,key2time)=0)if (xx2time=0)fout=fopen("key2.txt","a");fprintf(fout,"2t%dtt%sn",time,temp);fclose(fout);xx2time=1;fout=fopen("output.txt","a");fprintf(fout,"2t%dtt%sn",time,temp);fclose(fout);break;chin=fgetc(fin);fout=fopen("output.txt","a");fprintf(fout,"1t6ttn");fclose(fout);/* Main函数 */void mainFILE *fread;char charin;char command='Q'printf("n");printf("* C语言词法分析工具 *n");printf("* *n");printf("* *n");printf("* 命令如下: *n");printf("* 0 -> 查看保留字表文件 *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 -> 查看内部码文件 *n");printf("* - *n");printf("* Q -> 退出 *n");printf("*n");printf("n");load;scan;printf("n");printf("分析完成!n");getchar;printf("n");printf("请输入命令:");command=getchar;while (command!='Q')&&(command!='q')switch (command)case '0':printf("*n");printf("n");fread=fopen("key0.txt","r");charin=fgetc(fread);while (charin!=EOF)putchar(charin);charin=fgetc(fread);printf("n");printf("*n");printf("n");printf("请输入命令:");break;case '1':printf("*n");printf("n");fread=fopen("key1.txt","r");charin=fgetc(fread);while (charin!=EOF)putchar(charin);charin=fgetc(fread);printf("n");printf("*n");printf("n");printf("请输入命令:");break;case '2':printf("*n");printf("n");fread=fopen("key2.txt","r");charin=fgetc(fread);while (charin!=EOF)putchar(charin);charin=fgetc(fread);pr