www.pudn.com > BYUYIX.rar > BYUYIX.C
#include#define id 1 /*#define const 10 #define := 2 #define + 3 #define - 4 #define * 5 #define / 6 #define ( 21 #define ) 22 #define > 23 #define < 24 #define = 25 #define if 100 #define then 101 #define while 102 #define do 103 #define else 104 #define S->id:=E 1 #define E->E+E 2 #define E->E-E 3 #define E->E*E 4 #define E->E/E 5 #define E->-E 6 #define E->(E) 7 #define E->id 8 #define E->num 9 #define C->E>E 10 #define C->E if C then S 12 #define C->E=E 13 #define S->if C then S else S 14 #define S->while C do S 15*/ int lookhead; int w[20][20]; int label[20][20]; char chart[70][40]; int number,code=0,temp=30,temp1='0',stemp=50,stemp1='0'; main() { int cifa(); int j; int s1(); int match(); int s2(int,int); int newlabel(); lookhead=cifa(); j=s1(); if(j!=0) printf("\n right"); else printf("\nerror"); printf("\n\n 3 address:\n"); label[j][1]=newlabel(); s2(j,0); printf("%s:",chart[label[j][1]]); printf("\nend\n"); } int cifa() { int ch,i=0,m; int isletter(int); int isdigit(int); int rightchar(char); int key(char *a); ch=getc(stdin); while ((ch==' ')||(ch==10)) ch=getc(stdin); if(ch==-1) return(0); if ((!rightchar(ch))&&(ch!=-1)) { printf("\nerror %c isn't in my language",ch); return(-1); } if (isdigit(ch)) { code++; while(isdigit(ch)) { chart[code][i]=ch; ch=getc(stdin); i++; } chart[code][i]=0; ungetc(ch,stdin); return(10); } if(isletter(ch)) { code++; while (isletter(ch)||isdigit(ch)) { chart[code][i]=ch; ch=getc(stdin); i++; } chart[code][i]=0; ungetc(ch,stdin); return(key(chart[code])); } if(ch==':') { ch=getc(stdin); if(ch=='=') return (2); else return(0); } if(ch=='+') return (3); if(ch=='-') return (4); if(ch=='*') return (5); if(ch=='/') return (6); if(ch=='(') return (21); if(ch==')') return (22); if(ch=='>') return (23); if(ch=='<') return (24); if(ch=='=') return (25); } int isletter(int ch) { if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))) return(1); else return(0); } int isdigit(int ch) { if((ch>='0')&&(ch<='9')) return(1); else return(0); } int rightchar(char ch) { if (((ch>='0')&&(ch<='9')) ||((ch>='a')&&(ch<='z')) ||((ch>='A')&&(ch<='Z')) ||(ch==10)||(ch==':')||(ch=='=') ||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/') ||(ch=='(')||(ch==')')||(ch=='>')||(ch=='<')) return(1); else return(0); } int key(char *a) { if ((a[0]=='i')&&(a[1]=='f')&&(a[2]==0)) return(100); if ((a[0]=='t')&&(a[1]=='h')&&(a[2]=='e')&&(a[3]=='n')&&(a[4]==0)) return(101); if ((a[0]=='w')&&(a[1]=='h')&&(a[2]=='i')&&(a[3]=='l')&&(a[4]=='e')&&(a[5]==0)) return(102); if ((a[0]=='d')&&(a[1]=='o')&&(a[2]==0)) return(103); if ((a[0]=='e')&&(a[1]=='l')&&(a[2]=='s')&&(a[3]=='e')&&(a[4]==0)) return(104); return(1); } int match(int t) { if (lookhead==t) { lookhead=cifa(); return(1); } else return(0); } int s1() { int c1(); int e1(); int match(); int a,b,c,d,a1,i,j; switch(lookhead) { case 1: a1=code; a=match(1); b=match(2); c=e1(); number++; if(a&&b&&c) { /*printf("S->id:=E");*/ w[number][0]=1; w[number][1]=c; w[number][2]=a1; w[number][3]=0; /*printf(" number=%d, style=%d, next1=%d, id=%s\n", number,1,c,chart[a1]);*/ if((lookhead==0)||(lookhead==104)) return(number); else return(0); } else return(0); case 100: a=match(100); b=c1(); c=match(101); d=s1(); if (lookhead!=104) { if(lookhead!=0) return(0); number++; if(a&&b&&c&&d) { /*printf("S->if C then S");*/ w[number][0]=12; w[number][1]=b; w[number][2]=d; w[number][3]=0; /*printf(" number=%d, style=%d, next1=%d, next2=%d\n",number,12,b,d);*/ return(number); } else return(0); } else { i=match(104); if (lookhead==0) return(0); j=s1(); number++; if(a&&b&&c&&d&&i&&j) { if(lookhead!=0) return(0); /*printf("S->if C then S else S");*/ w[number][0]=14; w[number][1]=b; w[number][2]=d; w[number][3]=j; w[number][4]=0; /*printf(" number=%d, style=%d, next1=%d,next2=%d,next3=%d\n",number,14,b,d,j);*/ return(number); } else return(0); } case 102: a=match(102); b=c1(); c=match(103); d=s1(); number++; if(a&&b&&c&&d) { /*printf("S->while C do S");*/ w[number][0]=15; w[number][1]=b; w[number][2]=d; w[number][3]=0; /*printf(" number=%d, style=%d, next1=%d, next2=%d\n",number,15,b,d);*/ return(number); } else return(0); } return(0); } int c1() { int e1(); int match(); int a=0,c=0,d=0,i1=0,i2=0,i3=0; a=e1(); if((lookhead==23)||(lookhead==24)||(lookhead==25)) { d=lookhead; if(lookhead==23) i1=match(23); if(lookhead==24) i2=match(24); if(lookhead==25) i3=match(25); c=e1(); if((i1==0)&&(i2==0)&&(i3==0)||(c==0)) return(0); if(d==23) { number++; /*printf("C->E>E");*/ w[number][0]=10; w[number][1]=a; w[number][2]=c; w[number][3]=0; } if(d==24) { number++; /*printf("C->E E=E");*/ w[number][0]=13; w[number][1]=a; w[number][2]=c; w[number][3]=0; } return(number); } } int e1 () { int t1(); int match(); int a,b=0,c,d,g=0,k=1,h=0; if(lookhead!=4) { a=t1(); if(a==0) return (0); } else a=0; while((lookhead==3)||(lookhead==4)) { d=lookhead; if(lookhead==3) g=match(3); if(lookhead==4) b=match(4); c=t1(); if(((g==0)&&(b==0))||(c==0)) return(0); if(d==3) { number++; /*printf("E->E+E");*/ w[number][0]=2; if(k==1) { w[number][1]=a; k++; } else w[number][1]=h; w[number][2]=c; w[number][3]=0; h=number; /*printf(" number=%d, style=%d, next1=%d, next2=%d\n",number,2,w[number][1],c);*/ } if(d==4) { number++; if(a!=0) { /*printf("E->E-E");*/ w[number][0]=3; if(k==1) { w[number][1]=a; k++; } else w[number][1]=h; w[number][2]=c; w[number][3]=0; h=number; /*printf(" number=%d, style=%d, next1=%d, next2=%d\n",number,3,w[number][1],c);*/ } else { /*printf("E->-E");*/ w[number][0]=6; w[number][1]=c; w[number][2]=0; h=number; k++; a=1; /*printf(" number=%d, style=%d, next1=%d\n",number,6,w[number][1]);*/ } } } return(number); } int t1() { int f1(); int match(); int a,b=0,c,d,g=0,k=1,h=0; a=f1(); if(a==0) return(0); while((lookhead==5)||(lookhead==6)) { d=lookhead; if(lookhead==5) g=match(5); if(lookhead==6) b=match(6); c=f1(); if(((g==0)&&(b==0))||(c==0)) return(0); if(d==5) { number++; /*printf("E->E*E");*/ w[number][0]=4; if(k==1) { w[number][1]=a; k++; } else w[number][1]=h; w[number][2]=c; w[number][3]=0; h=number; /*printf(" number=%d, style=%d, next1=%d, next2=%d\n",number,4,w[number][1],c);*/ } if(d==6) { number++; /*printf("E->E/E");*/ w[number][0]=5; if(k==1) { w[number][1]=a; k++; } else w[number][1]=h; w[number][2]=c; w[number][3]=0; h=number; /*printf(" number=%d, style=%d, next1=%d, next2=%d\n",number,5,w[number][1],c);*/ } } return(number); } int f1() { int e1(); int match(); int a,b,c,d,a1; switch(lookhead) { case 1: a1=code; a=match(1); number++; if(a) { /*printf("E->id");*/ w[number][0]=8; w[number][1]=a1; w[number][2]=0; /*printf(" number=%d, style=%d, id=%s\n",number,8,chart[a1]);*/ return(number); } else return(0); case 21: a=match(21); b=e1(); c=match(22); number++; if(a&&b&&c) { /*printf("E->(E)");*/ w[number][0]=7; w[number][1]=b; w[number][2]=0; /*printf(" number=%d, style=%d, next1=%d\n",number,7,b);*/ return(number); } else return(0); case 10: a1=code; a=match(10); number++; if(a) { /*printf("E->num");*/ w[number][0]=9; w[number][1]=a1; w[number][2]=0; /*printf(" number=%d, style=%d, num=%s\n",number,9,chart[a1]);*/ return(number); } else return(0); } return(0); } int s2(int m,int m1) { int e2(int,int); int a; int newlabel(); switch(w[m][0]) { case 1: a=e2(w[m][1],0); printf("%s:=%s\n",chart[w[m][2]],chart[a]); return(1); case 12: label[m][2]=newlabel(); label[m][3]=label[m][1]; label[w[m][2]][1]=label[m][1]; e2(w[m][1],m); printf("%s: ",chart[label[m][2]]); s2(w[m][2],m); return(1); case 14: label[m][2]=newlabel(); label[m][3]=newlabel(); label[w[m][2]][1]=label[m][1]; label[w[m][3]][1]=label[m][1]; e2(w[m][1],m); printf("%s: ",chart[label[m][2]]); s2(w[m][2],m); printf(" goto %s\n",chart[label[m][1]]); printf("%s: ",chart[label[m][3]]); s2(w[m][3],m); return(1); case 15: switch(w[m1][0]) { case 12: label[m][0]=label[m1][2]; break; case 15: label[m][0]=label[m1][2]; break; case 14: if (m==w[m1][2]) label[m][0]=label[m1][2]; else label[m][0]=label[m1][3]; break; default: label[m][0]=newlabel(); printf("%s: ",chart[label[m][0]]); } label[m][2]=newlabel(); label[m][3]=label[m][1]; label[w[m][2]][1]=label[m][0]; e2(w[m][1],m); printf("%s: ",chart[label[m][2]]); s2(w[m][2],m); printf(" goto %s\n",chart[label[m][0]]); return(1); } } int e2(int m,int m1) { int a,b,c,t; int newtemp(); switch(w[m][0]) { case 2: t=newtemp(); a=e2(w[m][1],m); b=e2(w[m][2],m); printf("%s:=%s+%s\n",chart[t],chart[a],chart[b]); return(t); case 3: t=newtemp(); a=e2(w[m][1],m); b=e2(w[m][2],m); printf("%s:=%s-%s\n",chart[t],chart[a],chart[b]); return(t); case 4: t=newtemp(); a=e2(w[m][1],m); b=e2(w[m][2],m); printf("%s:=%s*%s\n",chart[t],chart[a],chart[b]); return(t); case 5: t=newtemp(); a=e2(w[m][1],m); b=e2(w[m][2],m); printf("%s:=%s/%s\n",chart[t],chart[a],chart[b]); return(t); case 6: t=newtemp(); a=e2(w[m][1],m); printf("%s:=0-%s\n",chart[t],chart[a]); return(t); case 7: a=e2(w[m][1],m); return(a); case 8: return(w[m][1]); case 9: return(w[m][1]); case 10: a=e2(w[m][1],m); b=e2(w[m][2],m); printf("if %s>%s goto %s\n",chart[a],chart[b],chart[label[m1][2]]); printf(" goto %s\n",chart[label[m1][3]]); return(-1); case 11: a=e2(w[m][1],m); b=e2(w[m][2],m); printf("if %s<%s goto %s\n",chart[a],chart[b],chart[label[m1][2]]); printf(" goto %s\n",chart[label[m1][3]]); return(-1); case 13: a=e2(w[m][1],m); b=e2(w[m][2],m); printf("if %s=%s goto %s\n",chart[a],chart[b],chart[label[m1][2]]); printf(" goto %s\n",chart[label[m1][3]]); return(-1); } } int newtemp() { temp++; chart[temp][0]='t'; chart[temp][1]=temp1; chart[temp][2]=0; temp1++; return(temp); } int newlabel() { stemp++; chart[stemp][0]='L'; chart[stemp][1]=stemp1; chart[stemp][2]=0; stemp1++; return(stemp); }