编译原理实验改进版(词法分析)

来源:互联网 发布:传奇游戏源码是什么 编辑:程序博客网 时间:2024/05/21 09:09

自动机用的是原来的

#include <stdio.h>#include <ctype.h>#include <string.h>char opword[]="+-*/=";char bordword[]="()";FILE *fin,*fout; int main(){char ch,token[40];int es=0,j,state,brp;if((fin=fopen("I1.txt","r"))==NULL){printf("\n打开词法分析输入文件出错!\n");return(1);}if((fout=fopen("O1.txt","w"))==NULL){printf("\n创建词法分析输出文件出错!\n");return(2);}ch=getc(fin);while(ch!=EOF){while(ch==' '||ch=='\n'||ch=='\t')ch=getc(fin);j=0;state=0;brp=1;while(brp){switch(state){case 0:if(ch=='.'){token[j++]=ch;state=1;ch=getc(fin);}else if(isdigit(ch)){token[j++]=ch;state=6;ch=getc(fin);}else if(isalpha(ch)){token[j++]=ch;ch=getc(fin);while(isalnum(ch)){token[j++]=ch;ch=getc(fin); }state=7;brp=0;}else if(strchr(bordword,ch)>0){token[j++]=ch;state=8;brp=0;ch=getc(fin);}else if(strchr(opword,ch)>0){token[j++]=ch;state=9;brp=0;ch=getc(fin);}else state=-1;break;case 1:if(isdigit(ch)){token[j++]=ch; ch=getc(fin);state=2;}else brp=0;break;case 2:while(isdigit(ch)){token[j++]=ch; ch=getc(fin);}if(ch=='E'||ch=='e'){token[j++]=ch; ch=getc(fin);state=3;}else brp=0;break;case 3:if(ch=='+'||ch=='-'){token[j++]=ch; state=4;ch=getc(fin);}else if(isdigit(ch)){token[j++]=ch; state=5;ch=getc(fin);}else brp=0;break;case 4:if(isdigit(ch)){token[j++]=ch; ch=getc(fin);state=5;}else brp=0;break;case 5:brp=0;break;case 6:while(isdigit(ch)){token[j++]=ch; ch=getc(fin);}if(ch=='.'){token[j++]=ch; ch=getc(fin);state=1;}else brp=0;break;default:state=-1;break;}}//printf("%d\n",state);token[j]='\0';if(state==6||state==5||state==2)fprintf(fout,"(%s,%s)\n","40",token);else if(state==7)fprintf(fout,"(%s,%s)\n","10",token);else if(state==8)fprintf(fout,"(%s,%s)\n","30",token);else if(state==9)fprintf(fout,"(%s,%s)\n","20",token); elsefprintf(fout,"(%s,%s)\n","ERROR",token);}fclose(fin);fclose(fout);printf("%d\n",es);return 0;}


原创粉丝点击