词法分析器C++代码

上传人:lil****ar 文档编号:283187079 上传时间:2022-04-27 格式:DOC 页数:4 大小:22.50KB
返回 下载 相关 举报
词法分析器C++代码_第1页
第1页 / 共4页
词法分析器C++代码_第2页
第2页 / 共4页
词法分析器C++代码_第3页
第3页 / 共4页
词法分析器C++代码_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《词法分析器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;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号