当前位置:文档之家› 用优先函数现对表达式的运算

用优先函数现对表达式的运算

用优先函数实现对表达式的运算班级学号姓名:指导老师:一. 实验目的:1、学习语法分析的主要方法;2、熟悉复习词法分析的方法;3、表达式求值;4、熟悉C语言并提高动手能力;二. 实验内容:输入一个表达式,判断是否正确后,求出其值;三.实验硬件和软件平台:INTEL C433MHz Cpu128Mb SDRAMTurbo C 2.0Microsoft Windows XP SP1四.步骤和算法描述:1.调用词法分析程序,转换表达式成为类号;2.调用语法分析程序,判断表达式正确与否;3.根据代码的优先级,求表达式的值;五.源程序:#include <stdio.h>#include <string.h>#include <io.h>#include <stdlib.h>#include <math.h>#include "d:\TURBOC2\document1.c" #include"d:\TURBOC2\documentNEW.c"int check=10;int change(char *cd1,int a){int len,i,o=0,c,j;for(i=0;i<a;i++){c=1;for(j=a-1;j>=i;j--){if(j==i) c=1*c;else c=c*10;}o=o+(cd1[i+1]-48)*c; }return(o);}int Count(int a,int b,char c){ int dd;switch(c){case '*':dd=a*b;break;case '/':dd=a/b;break;case '+':dd=a+b;break;case '-':dd=a-b;break;default :printf("Error!");}return(dd);}char compare(char a,char b){if(a=='*'&&b=='/') return('>'); if(a=='/'&&b=='*') return('>'); if(a=='+'&&b=='-') return('>'); if(a=='-'&&b=='+') return('>'); if(a=='*'&&b=='+') return('>'); if(a=='*'&&b=='-') return('>'); if(a=='/'&&b=='+') return('>'); if(a=='/'&&b=='-') return('>'); if(a=='+'&&b=='*') return('<'); if(a=='+'&&b=='/') return('<'); if(a=='-'&&b=='*') return('<'); if(a=='+'&&b=='*') return('<'); if(a=='*'&&b=='(') return('<'); if(a=='/'&&b=='(') return('<'); if(a=='+'&&b=='(') return('<'); if(a=='-'&&b=='(') return('<'); if(a=='*'&&b==')') return('>'); if(a=='/'&&b==')') return('>'); if(a=='+'&&b==')') return('>'); if(a=='-'&&b==')') return('>'); if(a=='('&&b=='*') return('<'); if(a=='('&&b=='/') return('<'); if(a=='('&&b=='+') return('<'); if(a=='('&&b=='-') return('<'); if(a==')'&&b=='*') return('>'); if(a==')'&&b=='/') return('>'); if(a==')'&&b=='+') return('>'); if(a==')'&&b=='-') return('>'); if(a=='*'&&b==';') return('>'); if(a=='/'&&b==';') return('>'); if(a=='+'&&b==';') return('>'); if(a=='-'&&b==';') return('>'); if(a=='#'&&b=='*') return('<'); if(a=='#'&&b=='/') return('<'); if(a=='#'&&b=='-') return('<'); if(a=='#'&&b=='+') return('<');if(a=='#'&&b==';') return('=');if(a=='('&&b=='(') return('<');if(a==')'&&b==')') return('>');if(a==')'&&b=='#') return('>');if(a=='*'&&b=='*') return('>');if(a=='/'&&b=='/') return('>');if(a=='+'&&b=='+') return('>');if(a=='-'&&b=='-') return('>');if(a=='('&&b==')') return('=');if(a==')'&&b==';') return('>');}main(){FILE *fp,*fq;char c1[100],c;char chuan[100];int c2[100],d,i=0,j=0,result,ii=0,a,b; clrscr();fp=fopen("document1.txt","wr");if(!fp) printf("Open File Error!");else{printf("Please Input biao da shi :\n");while((c=getchar())!='#')fprintf(fp,"%c",c);fclose(fp);cifa();yufa();if(check==10){printf("yufa OK!");fp=fopen("document1.txt","r");fq=fopen("document3.txt","w");if(!fq||!fp) printf("file not open!");else{fscanf(fp,"%c",&c);fscanf(fp,"%c",&c);while(c!=';'){fscanf(fp,"%c",&c);while(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='('&&c!=')'&&c!=';'){fprintf(fq,"%c",c);fscanf(fp,"%c",&c);}fprintf(fq," %c ",c);}fclose(fp);fclose(fq);}}else{printf("yufa Error!");exit(0);}}for(i=0;i<100;i++) {c1[i]=' ';c2[i]=0;} c1[j++]='#';fp=fopen("document3.txt","r"); fscanf(fp,"%c",&c);i=0;while(c!=';'||c1[j-1]!='#'){if(c!='*'&&c!='/'&&c!='+'&&c!='-'&&c! ='('&&c!=')'&&c!=';'&&c!=' '){i=0;while(c>='0'&&c<='9'){i++;chuan[i]=c;fscanf(fp,"%c",&c);}ii++;c2[ii]=change(chuan,i);}if(c==' ') fscanf(fp,"%c",&c);if(c=='*'||c=='/'||c=='+'||c=='-'||c=='('||c==') '||c==';'){switch(compare(c1[j-1],c)){case '<':c1[j++]=c;fscanf(fp,"%c",&c);break;case '=':j=j-1;fscanf(fp,"%c",&c);break;case '>':if(ii>=2){a=c2[ii];ii=ii-1;b=c2[ii];result=Count(b,a,c1[--j]);c1[j]=c;c2[ii]=result;break;}else{c1[j++]=c;fscanf(fp,"%c",&c);break;}}}}printf("\nresult->%d\n",result); }。

相关主题