www.pudn.com > jufafenxi.rar > 3.c
#include#include #include #include #define keywordSum 12 char *keyword[keywordSum]={"if","else","return","min","void","main","for","while","do","int","read","write"}; char singleword[50]="+-*(){};,:"; char doubleword[10]="><=!"; int TESTscan(); char Scanin[300],Scanout[300]; int TESTparse(); int program(); int compoud_Stat(); int statement(); int expression_stat(); int expression(); int bool_expr(); int additive_expr(); int term(); int factor(); int if_stat(); int while_stat(); int for_stat(); int write_stat(); int read_stat(); int declaration_stat(); int declaration_list(); int statement_list(); int compound_stat(); char token[20],token1[40]; extern char Scanout[300]; FILE *fp; FILE *fin,*fout; // int TESTscan() { char ch,token[40]; int es=0,j,n; printf("请输入源程序的路径:"); scanf("%s",Scanin); printf("请输入词法分析输出的路径:"); scanf("%s",Scanout); if((fin=fopen(Scanin,"r"))==NULL) { printf("\n打开词法分析输入文件出错!!\n"); return(1); } if((fout=fopen(Scanout,"w"))==NULL) { printf("\n创建词法分析输出文件出错!!\n"); return(2); } ch=getc(fin); while(ch!=EOF) { while(ch==' '||ch=='\n'||ch=='\t')ch=getc(fin); if(isalpha(ch)) { token[0]=ch;j=1; ch=getc(fin); while(isalnum(ch)) { token[j++]=ch; ch=getc(fin); } token[j]='\0'; n=0; while((n =keywordSum) fprintf(fout,"%s\t%s\n","ID",token); else fprintf(fout,"%s\t%s\n",token,token); }else if(isdigit(ch)) { token[0]=ch;j=1; ch=getc(fin); while(isdigit(ch)) { token[j++]=ch; ch=getc(fin); } token[j]='\0'; fprintf(fout,"%s\t%s\n","NUM",token); }else if(strchr(singleword,ch)>0) { token[0]=ch;token[1]='\0'; ch=getc(fin); fprintf(fout,"%s\t%s\n",token,token); }else if(strchr(doubleword,ch)>0) { token[0]=ch; ch=getc(fin); if(ch=='=') { token[1]=ch;token[2]='\0'; ch=getc(fin); }else token[1]='\0'; fprintf(fout,"%s\t%s\n",token,token); }else if(ch=='/') { ch=getc(fin); if(ch=='*') { char ch1; ch1=getc(fin); do { ch=ch1;ch1=getc(fin); } while((ch!='*'||ch!='/')&&ch1!=EOF); ch=getc(fin); }else { token[0]='/';token[1]='\0'; fprintf(fout,"%s\t%s\n",token,token); } }else { token[0]=ch;token[1]='\0'; ch=getc(fin); es=3; fprintf(fout,"%s\t%s\n","ERROR",token); } } fclose(fin); fclose(fout); return(es); } // int TESTparse() { int es=0; if((fp=fopen(Scanout,"r"))==NULL) { printf("\n打开%s错误!\n",Scanout); es=10; } if(es==0)es=program(); printf("=====语法分析错误!=====\n"); switch(es) { case 0:printf("语法分析成功!\n");break; case 10:printf("打开文件%s失败\n",Scanout);break; case 1:printf("缺少{!\n");break; case 2:printf("缺少}!\n");break; case 3:printf("缺少标志符!\n");break; case 4:printf("缺少分号!\n");break; case 5:printf("缺少(!\n");break; case 6:printf("缺少)!\n");break; case 7:printf("缺少操作数!\n");break; } fclose(fp); return(es); } // int program() { int es=0; fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); if(strcmp(token,"{")) { es=1; return(es); } fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=declaration_list(); if(es>0)return(es); es=statement_list(); if(es>0)return(es); if(strcmp(token,"}")) { es=2; return(es); } return(es); } // int declaration_list() { int es=0; while(strcmp(token,"int")==0) { es=declaration_stat(); if(es>0)return(es); } return(es); } // int declaration_stat() { int es=0; fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); if(strcmp(token,"ID"))return(es=3); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); if(strcmp(token,";"))return(es=4); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); return(es); } // int statement_list() { int es=0; while(strcmp(token,"}")) { es=statement(); if(es>0)return(es); } return(es); } // int statement() { int es=0; if(es==0&&strcmp(token,"if")==0)es=if_stat(); if(es==0&&strcmp(token,"while")==0)es=while_stat(); if(es==0&&strcmp(token,"for")==0)es=for_stat(); if(es==0&&strcmp(token,"read")==0)es=read_stat(); if(es==0&&strcmp(token,"write")==0)es=write_stat(); if(es==0&&strcmp(token,"{")==0)es=compound_stat(); if(es==0&&strcmp(token,"ID")==0||strcmp(token,"NUM")==0) es=expression_stat(); return(es); } // int if_stat() { int es=0; fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); if(strcmp(token,"("))return(es=5); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=expression(); if(es>0)return(es); if(strcmp(token,")"))return(es=6); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=statement(); if(es>0)return(es); if(strcmp(token,"else")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=statement(); if(es>0)return(es); } return(es); } // int while_stat() { int es=0; fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); if(strcmp(token,"("))return(es=5); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=expression(); if(es>0)return(es); if(strcmp(token,")"))return(es=6); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=statement(); return(es); } // int for_stat() { int es=0; fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); if(strcmp(token,"("))return(es=5); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=expression(); if(es>0)return(es); if(strcmp(token,";"))return(es=4); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=expression(); if(es>0)return(es); if(strcmp(token,";"))return(es=4); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=expression(); if(es>0)return(es); if(strcmp(token,")"))return(es=6); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=statement(); return(es); } // int write_stat() { int es=0; fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=expression(); if(es>0)return(es); if(strcmp(token,";"))return(es=4); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); return(es); } // int read_stat() { int es=0; fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); if(strcmp(token,"ID"))return(es=3); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); if(strcmp(token,";"))return(es=4); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); return(es); } // int compound_stat() { int es=0; fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=statement_list(); return(es); } // int expression_stat() { int es=0; if(strcmp(token,";")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); return(es); } es=expression(); if(es>0)return(es); if(es==0&&strcmp(token,";")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); return(es); }else { es=4; return(es); } } // int expression() { int es=0,fileadd; char token2[20],token3[40]; if(strcmp(token,"ID")==0) { fileadd=ftell(fp); fscanf(fp,"%s%s\n",&token2,&token3); printf("%s%s\n",token2,token3); es=bool_expr(); if(es>0)return(es); if(strcmp(token2,"=")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); }else { fseek(fp,fileadd,0); printf("%s%s\n",token,token1); es=bool_expr(); if(es>0)return(es); } } return(es); } // int bool_expr() { int es=0; es=additive_expr(); if(es>0)return(es); if(strcmp(token,">")==0||strcmp(token,">=")==0 ||strcmp(token,"<")==0||strcmp(token,"<=")==0 ||strcmp(token,"==")==0||strcmp(token,"!=")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=additive_expr(); if(es>0)return(es); } return(es); } // int additive_expr() { int es=0; es=term(); if(es>0)return(es); while(strcmp(token,"+")==0||strcmp(token,"-")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=term(); if(es>0)return(es); } return(es); } // int term() { int es=0; es=factor(); if(es>0)return(es); while(strcmp(token,"*")==0||strcmp(token,"/")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=factor(); if(es>0)return(es); } return(es); } // int factor() { int es=0; if(strcmp(token,"(")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=expression(); if(es>0)return(es); if(strcmp(token,")")==0)return(es=6); fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); }else { if(strcmp(token,"ID")==0||strcmp(token,"NUM")==0) { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); return(es); }else { es=7; return(es); } } return(es); } // void main() { int es=0; es=TESTscan(); if(es>0){ printf("词法分析错误,编译停止!");} else {printf("词法分析成功!\n");} if(es==0) { es=TESTparse(); if(es=0)printf("语法分析成功!\n"); else printf("语法分析错误!\n"); } }