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->Eif 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->EE=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); 
}