开发工具:
文件大小: 275kb
下载次数: 0
上传时间: 2009-12-17
详细说明: 这是一个比较强的词法分析器:代码分析 在整个程序代码中,分别定义了5个主要的分函数,将字符转换成二进制的字符形式。代码如下: char * dtb(char *buf) { int temp[20]; char *binary; int value=0,i=0,j; for(i=0;buf[i]!='\0';i++) value=value*10+(buf[i]-48); /*先将字符转化为十进制数*/ if(value==0) { binary=(char*)malloc(2*sizeof(char)); binary[0]='0'; binary[1]='\0'; return(binary); } i=0; while(value!=0) { temp[i++]=value%2; value/=2; } temp[i]='\0'; binary=(char*)malloc((i+1)*sizeof(char)); for(j=0;j<=i-1;j++) binary[j]=(char)(temp[i-j-1 ]+48); /*将temp数组中的元素从后往前转换为字符0|1后输入到binary数组中*/ binary[i]='\0'; return(binary); } 此函数在数字串处理函数中要用到。 void cs_manage(char *buffer) { FILE *fp; char *pointer; int result; pointer=dtb(buffer); result=find(pointer,3,2); /*先查常数表,若找不到则造入常数表并返回序号值*/ fp=fopen("output.txt","a"); fprintf(fp,"%s\t\t\t3\t\t\t%d\n",buffer,result); fclose(fp); /*写入输出文件*/ } 此函数是对字符串进行常数的判断,其中用到了一个调用函数find(),此函数是整个程序的核心内容,它为对字符串进行检索,检索的目标文档为k.txt 1.txt i.txt c.txt,即判断字符串是否为关键字,运算符,标识符,或是常数。函数如下: int find(char *buf,int type,int command) { int number=0; FILE *fp; char c; char temp[30]; int i=0; switch(type) { case 1: fp=fopen("k.txt","r");break; /*关键字文件*/ case 2: fp=fopen("i.txt","r");break; /*标识符文件*/ case 3: fp=fopen("c.txt","r");break; /*常数文件*/ case 4: fp=fopen("l.txt","r"); /*运算符文件*/ } c=fgetc(fp); /*读取某一文件的字符*/ while(c!=EOF) { while(c!='\n') { temp[i++]=c; c=fgetc(fp); } /*读取了某一字符串*/ temp[i]='\0'; i=0; number++; if(strcmp(temp,buf)==0) /*两数组进行比较*/ { fclose(fp); return(number); /*若找到,返回在相应表中的序号*/ } else c=fgetc(fp); /*读取下一个字符*/ } if(command==1) { fclose(fp); return(0); /*找不到,当只需查表,返回0,否则还需造表*/ } switch(type) { case 1: fp=fopen("k.txt","a");break; case 2: fp=fopen("i.txt","a");break; case 3: fp=fopen("c.txt","a");break; case 4: fp=fopen("l.txt","a"); } fprintf(fp,"%s\n",buf); fclose(fp); return(number+1); /*造表时,将字符串添加到表尾并返回序号值*/ } 最后一个重要的是字符串处理,代码如下: void ch_manage(char *buffer) { FILE *fp; int result; result=find(buffer,1,1); /*先查关键字表*/ fp=fopen("output.txt","a"); if(result!=0) fprintf(fp,"%s\t\t\t1\t\t\t%d\n",buffer,result); /*若找到,将字符串和序号写入输出文件*/ else { result=find(buffer,2,2); /*若找不到,则非关键字,查标识符表,还找不到则造入标识符表*/ fprintf(fp,"%s\t\t\t2\t\t\t%d\n",buffer,result); } /*写入输出文件*/ fclose(fp); } ...展开收缩
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.