www.pudn.com > digui5.rar > digui5.cpp


/* 
  文法G(S) 
  S-->DGWE 
  G-->c=R 
  R-->dTe|d 
  T-->+|-|*|/ 
  E-->aFb 
  F--> >|< 
*/ 
 
#include  
#include 
#include 
#include 
 
char a[50],g[50][50]; //a[50]保存输入串,g[50][50]保存四元式 
char ch; 
int i1=0,i2=0,i3=0; //i1通过自加来取得a[i1]输入串中的字符 i2用来选择用哪种四元式,i3用来选择用'W'的报错 
int total=0;   
 
void S(); 
void D(); 
void G(); 
void W(); 
void E(); 
void R(); 
void T(); 
void F(); 
 
 
 
void main() 
{    
   int p,j=0; 
   char str[20]; 
    
   
    printf("请输入do-while语句(D代表do,W代表while),并以#结束:\n"); 
	do{ 
	  scanf("%s",str); 
	   
	  if(strcmp(str,"do")==0) 
	  {  
		  a[j]='D'; 
		  j++; 
	  } 
	  else if(strcmp(str,"while")==0) 
	  {  
		  a[j]='W'; 
		  j++; 
	  } 
	  else if(strcmp(str,"c=d+e")==0) 
	  {  
		  a[j]='c'; 
		  a[j+1]='='; 
			  a[j+2]='d'; 
			  a[j+3]='+'; 
				  a[j+4]='e'; 
				  j=j+5; 
				  continue; 
	  } 
	  else if(strcmp(str,"c=d-e")==0) 
	  { 
		  a[j]='c'; 
		  a[j+1]='='; 
			  a[j+2]='d'; 
			  a[j+3]='-'; 
				  a[j+4]='e'; 
				  j=j+5; 
				  continue; 
	  } 
	  else if(strcmp(str,"c=d*e")==0) 
		  { 
		  a[j]='c'; 
		  a[j+1]='='; 
			  a[j+2]='d'; 
			  a[j+3]='*'; 
				  a[j+4]='e'; 
				  j=j+5; 
				  continue; 
	  } 
	  else if(strcmp(str,"c=d/e")==0) 
		  { 
		  a[j]='c'; 
		  a[j+1]='='; 
			  a[j+2]='d'; 
			  a[j+3]='/'; 
				  a[j+4]='e'; 
				  j=j+5; 
				  continue; 
	  } 
	  else if(strcmp(str,"a>b")==0) 
		  { 
		  a[j]='a'; 
		  a[j+1]='>'; 
			  a[j+2]='b';			  
				  j=j+3; 
				  continue; 
	  } 
	  else if(strcmp(str,"aDGWE\n",total);total++;//total用来记数 
      
   D(); 
   G(); 
    
    
    
} 
 
void D() 
{  
	 if(ch!='D') 
	 { printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); 
	  getchar(); 
      getchar(); 
	  exit(1);} 
       ch=a[++i1]; 
 
} 
  
void G() 
{  int i=i1+1; 
   
  if(ch!='c') 
	 { printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); 
	  getchar(); 
      getchar(); 
	  exit(1);} 
  if(a[i]!='=') 
	 { printf("第%d个字符%c为有非法字符请按回车返回!!",i+1,a[i]); 
	  getchar(); 
      getchar(); 
	  exit(1);} 
 
  printf("%d\tG-->c=R\n",total);total++; 
	  R(); 
} 
 
void R() 
{   
   int i; 
    i=i1+1; 
	i1=i1+2; 
  ch=a[i1]; 
  if(a[i]!='=') 
  {   
  
	  printf("第%d个字符%c为有非法字符请按回车返回!!",i+1,a[i]); 
	  getchar(); 
      getchar(); 
	  exit(1);   
  } 
  if(ch!='d') 
	   {   
  
	  printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); 
	  getchar(); 
      getchar(); 
	  exit(1);   
  } 
 
   
      
    if((a[i1+1]=='+')||(a[i1+1]=='-')||(a[i1+1]=='*')||(a[i1+1]=='/')) 
	{ 
		printf("%d\tR-->dTe\n",total);total++; 
		i2=3;		 
		T(); 
 
	} 
	else 
	{ 
		printf("%d\tR-->d\n",total);total++; 
		i2=2; 
        strcpy(g[0],"(=,c,d,_)"); 
		i3=1; 
		W(); 
		E(); 
	} 
  
     
} 
 
void T() 
{ 
  ch=a[++i1]; 
  switch(ch) 
  { 
  case '+': 
    	printf("%d\tT-->+\n",total);total++; 
		strcpy(g[0],"(+,d,e,T)"); 
		strcpy(g[1],"(=,T,_,c)"); 
		break; 
  case '-': 
        printf("%d\tT-->-\n",total);total++; 
         strcpy(g[0],"(-,d,e,T)"); 
		strcpy(g[1],"(=,T,_,c)"); 
		break; 
  case '*': 
        printf("%d\tT-->*\n",total);total++; 
         strcpy(g[0],"(*,d,e,T)"); 
		strcpy(g[1],"(=,T,_,c)"); 
		break; 
   
  default: 
	   printf("%d\tT-->/\n",total);total++; 
        strcpy(g[0],"(/,d,e,T)"); 
		strcpy(g[1],"(=,T,_,c)"); 
		break;   
  } 
  W(); 
  E(); 
 
} 
void W() 
{ 
 if(i3==1) 
 {  
	ch=a[++i1]; 
   if(ch!='W') 
   {  
	  printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); 
	  getchar(); 
      getchar(); 
	  exit(1); 
  } 
  
 } 
 else{++i1; 
 ch=a[++i1]; 
 if(ch!='W') 
   {  
	  printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); 
	  getchar(); 
      getchar(); 
	  exit(1); 
  } 
 } 
} 
 
void E() 
{ 
  ch=a[++i1]; 
   if(ch!='a') 
   {  
	  printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); 
	  getchar(); 
      getchar(); 
	  exit(1); 
  } 
  printf("%d\tE-->aFb\n",total);total++; 
  F(); 
} 
 
void F() 
{ 
    int i; 
	ch=a[++i1]; 
	i=i1+1; 
 
 
if(a[i]!='b') 
   {  
	  printf("第%d个字符%c为有非法字符请按回车返回!!",i+1,a[i]); 
	  getchar(); 
      getchar(); 
	  exit(1); 
  } 
 if(i2==2) 
  switch(ch) 
 { 
   case '>':     
        printf("%d\tF-->>\n",total);total++; 
         
		strcpy(g[1],"(j>,a,b,100)"); 
		break; 
    
       default:    
        printf("%d\tF--> <\n",total);total++; 
          
		strcpy(g[1],"(j<,a,b,100)");		 
		break; 
  
 } 
 else if(i2==3) 
   switch(ch) 
 { 
   case '>':     
        printf("%d\tF--> >\n",total);total++; 
         
		strcpy(g[2],"(j>,a,b,100)"); 
		break; 
   
     default:    
        printf("%d\tF--> <\n",total);total++; 
          
		strcpy(g[2],"(j<,a,b,100)");		 
		break; 
  
 } 
  ch='#'; 
 
}