《词法分析器C++代码》由会员分享,可在线阅读,更多相关《词法分析器C++代码(4页珍藏版)》请在金锄头文库上搜索。
1、#include#include#define MAX 22 /*分析表的最大容量*/#define RES_MAX 10 /*关键字的最大长度*/#define MAXBUF 255 /*缓冲区的大小*/char ch = ; /*存放读入当前的输入字符*/int Line_NO; /*纪录行号*/struct reserve /*关键字*/ char lexptrMAXBUF; int token;struct reserve symtableMAX;char strMAX10=program,begin,end,var,integer,real, for,if,then,else,do,
2、while,array,procedure, function,of,boolean,const,div,mod,and,or;void init() /*对关键字表进行初始化,div,mod,and,or也作为关键字处理*/ /*最小的token是program:3,最大的token是or:24*/ int j; for(j=0; jMAX; j+) strcpy(symtablej.lexptr,strj); symtablej.token=j+3; /*对关键字进行搜索*/int se_res(char * is_res) int i; for(i=0;iMAX;i+) if(strcm
3、p(symtablei.lexptr,is_res)=0) break; if(iMAX) return symtablei.token; else return 0;/*判断是否为字母*/int IsLetter(char c) if(c=a)|(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) char arrMAXBUF; /* 输入缓冲区,存放一个单词符号
4、*/ int j=0; while(ch=fgetc(fpin)!=EOF) if(ch= |ch=t) /*碰到空格、tab则跳过*/ else if(ch=n)Line_NO+;/*字符串的处理*/ else if(IsLetter(ch) while(IsLetter(ch)|IsDigit(ch) if(ch=A) ch=ch+32; /*忽略大小写*/ arrj=ch; j+; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); /*输入指针回退一个字符*/ arrj=0; j=0; if (se_res(arr) /*如果是关键字*/ fprintf
5、(fpout,%stt%dn,arr,se_res(arr); else fprintf(fpout,%stt%dn,arr,1); /*普通标识符*/*数字的处理*/ else if(IsDigit(ch) while(IsDigit(ch) arrj=ch; j+; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); arrj=0; j=0; fprintf(fpout,%stt%dn,arr,2) ; /*无符号整数*/ else switch(ch) case+ :fprintf(fpout,%stt%dn,+,41);break; case- :fpr
6、intf(fpout,%stt%dn,-,42);break; case* :fprintf(fpout,%stt%dn,*,43);break; case( :fprintf(fpout,%stt%dn,(,25);break; case) :fprintf(fpout,%stt%dn,),26);break; case :fprintf(fpout,%stt%dn,27);break; case :fprintf(fpout,%stt%dn,28);break; case; :fprintf(fpout,%stt%dn,;,36);break; case= :fprintf(fpout,%
7、stt%dn,=,38);break; case. :fprintf(fpout,%stt%dn,.,39);break; case, :fprintf(fpout,%stt%dn,40);break; case: :ch=fgetc(fpin); if(ch=) fprintf(fpout,%stt%dn,:=,29); else fprintf(fpout,%stt%dn,:,30);fseek(fpin,-1L,SEEK_CUR); break; case :ch=fgetc(fpin); if(ch=) fprintf(fpout,%stt%dn,=,30); else fprintf
8、(fpout,%stt%dn,31);fseek(fpin,-1L,SEEK_CUR); break; case :ch=fgetc(fpin); if(ch=) fprintf(fpout,%stt%dn,) fprintf(fpout,%stt%dn,35); elsefprintf(fpout,%stt%dn,33);fseek(fpin,-1L,SEEK_CUR); break; /*出现在 之间的全部作为注释部分处理*/ case :ch=fgetc(fpin); while(ch!=&ch!=EOF) ch=fgetc(fpin); if(ch=EOF) fprintf(fpout
9、,缺少一个); break; /*非法字符*/ default :fprintf(fpout,在第%d行无法识别的字符t%cn,Line_NO,ch); /*主程序中完成对输入输出文件的读写*/int main() char in_fn25,out_fn25; FILE * fpin,* fpout; printf(/ci fa fen xi qi/n); printf(input the input file exmaple:fin.txt:n); scanf(%s,in_fn); printf(input the output file exmaple:fout.txt:n); scanf(%s,out_fn); fpin=fopen(in_fn,r); fpout=fopen(out_fn,w); init(); analyse(fpin,fpout); fclose(fpin); fclose(fpout); / system(pause); return 0;