1、编译原理C语言词法分析器编译原理C语言词法分析器(总23页)编译原理 C语言词法分析器一、实验题目编制并调试C词法分析程序。a.txt源代码: main() int sum=0 ,it=1;/* Variable declaration*/ if (sum=1) it+; else it=it+2; 设计其词法分析程序,能识别出所有的关键字、标识符、常数、运算符(包括复合运算符,如+)、界符;能过滤掉源程序中的注释、空格、制表符、换行符;并且能够对一些词法规则的错误进行必要的处理,如:标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。实验要求:要给出所分析语言的词法说明,相应
2、的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。 二、实验目的 1、理解词法分析在编译程序中的作用; 2、掌握词法分析程序的实现方法和技术; 3、加深对有穷自动机模型的理解。 三、主要函数void load ( ) void char_search (char *word)void main ( ) void intb_search(char *word)void scan ( ) void c_search(char *word)void inta_search(char *word) void cc_search(char *word)四、设计1.主函数 void main
3、 ( )2. 初始化函数 void load ( )3. 保留字及标识符判断函数 void char_search(char *word)4. 整数类型判断函数 void inta_search(char *word)5. 浮点类型判断函数 void intb_search(char *word)6. 字符串常量判断函数 void cc_search(char *word)7. 字符常量判断函数 void c_search(char *word) 同4、5函数图8.主扫描函数 void scan ( )五、关键代码#include #include #include char *key0= ,
4、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= ,+,-,*,/,%,=,=,=,!=,!,&,|,|,&,=,:,
5、-,+,-,.,+=,-=,*=,/=;/*运算符表*/int xx035,xx110,xx231;int temp_key3=0,temp_c40=0,temp_c41=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 *floading; if (floading=fopen(,w)=NULL) printf(Error! Cant create
6、 file : ); return; fclose (floading); /*建立保留字表文件:*/ if (floading=fopen(,w)=NULL) printf(Error! Cant create file : ); return; /*建立分隔符表文件:*/ if (floading=fopen(,w)=NULL) printf(Error! Cant create file : ); return; fclose(floading); /*建立运算符表文件:*/ if (floading=fopen(,w)=NULL) printf(Error! Cant create f
7、ile : ); return; fclose (floading); /*建立标识符表文件:*/ if (floading=fopen(,w)=NULL) printf(Error! Cant create file : ); return; fclose (floading); /*建立整数类型常量表文件:*/ if (floading=fopen(,w)=NULL) printf(Error! Cant create file : ); return; fclose (floading); /*建立浮点类型常量表文件:*/ if (floading=fopen(,w)=NULL) pri
8、ntf(Error! Cant create file : ); return; fclose (floading); /*建立字符类型常量表文件:*/ if (floading=fopen(,w)=NULL) printf(Error! Cant create file : ); return; fclose (floading); /*建立字符串类型常量表文件:*/ if (floading=fopen(,w)=NULL) printf(Error! Cant create file : ); return; fclose (floading); /*建立注释文件:*/ if (fload
9、ing=fopen(,w)=NULL) printf(Error! Cant create file : ); return; fclose (floading); /*建立内部码文件:*/ 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
10、: temp_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 (floa
11、ding); /*建立浮点类型常量临时文件: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*
12、/* 保留字及标识符判断函数 */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(,a); fprintf(foutput,0t%dtt%sn,m,word); fclose(foutput); xx0m=1; foutpu
13、t=fopen(,a); fprintf(foutput,0t%dtt%sn,m,word); fclose(foutput); else if (temp_key3=0) foutput=fopen(temp_key3,a); fprintf(foutput,%sn,word); fclose(foutput); temp_key3+; foutput=fopen(,a); fprintf(foutput,3t1tt%sn,word); fclose(foutput); finput=fopen(temp_key3,r); c=fgetc(finput); while (c!=EOF) wh
14、ile (c!=n) cscsi+=c; c=fgetc(finput); cscsi=0; csi=0; line+; if (strcmp(cs,word)=0) value2=1; break; else value2=0; c=fgetc(finput); fclose(finput); if (value2=1) foutput=fopen(,a); fprintf(foutput,3t%dtt%sn,line,word); fclose(foutput); else foutput=fopen(temp_key3,a); fprintf(foutput,%sn,word); fcl
15、ose(foutput); temp_key3+; foutput=fopen(,a); fprintf(foutput,3t%dtt%sn,temp_key3,word); fclose(foutput); foutput=fopen(,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 val
16、ue2=0; if (temp_c40=0) foutput=fopen(temp_c40,a); fprintf(foutput,%sn,word); fclose(foutput); temp_c40+; foutput=fopen(,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 (s
17、trcmp(cs,word)=0) value2=1; break; c=fgetc(finput); fclose(finput); if (value2=1) foutput=fopen(,a); fprintf(foutput,4t0t%dt%sn,line,word); fclose(foutput); else foutput=fopen(temp_c40,a); fprintf(foutput,%sn,word); fclose(foutput); temp_c40+; foutput=fopen(,a); fprintf(foutput,4t0t%dt%sn,temp_c40,w
18、ord); fclose(foutput); foutput=fopen(,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); fclos
19、e(foutput); temp_c41+; foutput=fopen(,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)
20、foutput=fopen(,a); fprintf(foutput,4t1t%dt%sn,line,word); fclose(foutput); else foutput=fopen(temp_c41,a); fprintf(foutput,%sn,word); fclose(foutput); temp_c41+; foutput=fopen(,a); fprintf(foutput,4t1t%dt%sn,temp_c41,word); fclose(foutput); foutput=fopen(,a); fprintf(foutput,4t1t%dt%sn,temp_c41,word
21、); 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(,a); fprintf(foutput,4t3t1t%sn,word); fclose(f
22、output); 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(,a); fprintf(foutput,4t3t%dt%sn,line,word); fclose(foutput); else fou
23、tput=fopen(temp_c43,a); fprintf(foutput,%sn,word); fclose(foutput); temp_c43+; foutput=fopen(,a); fprintf(foutput,4t3t%dt%sn,temp_c43,word); fclose(foutput); foutput=fopen(,a); fprintf(foutput,4t3t%dt%sn,temp_c43,word); fclose(foutput); /* 字符常量判断函数 */void c_search(char *word) FILE *foutput,*finput;
24、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(,a); fprintf(foutput,4t2t1t%sn,word); fclose(foutput); finput=fopen(temp_c42,r); c=fgetc(finput); while (c!=EOF) while (c!=n) cscsi
25、+=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(,a); fprintf(foutput,4t2t%dt%sn,line,word); fclose(foutput); else foutput=fopen(temp_c42,a); fprintf(foutput,%sn,word); fclose(foutput); temp_c42+; foutput=fopen(,a); fprintf(foutput,4t2t%dt%sn,temp_c42,word); fclose(foutput); foutp
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1