⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp1.cpp

📁 三个关于编译原理的课程设计
💻 CPP
字号:
#include<stdio.h>
#include<string.h>



char fenxibiao[8][8]={{'#','#','#','#','#','#','#','>'},{'#','#','=','<','#','<','#','>'},{'#',
'=','#','#','#','=','#','>'},{'#','#','<','<','=','<','#','>'},{'#','>','#','#','#','>','#','>'},
{'#','>','#','#','#','>','=','>'},{'#','>','#','#','#','>','#','>'},{'<','<','<','<','<','<','<',
'='}};



typedef struct
{char L[10];
 int top;
}zhan;



char chanshengshi[4][5]={"bAb","(B","a","Aa)"};



void zhichuzhan(zhan *t)
{t->top=0;
 t->L[t->top]='$';
}



int panduan1(zhan *p,char L[10],int t)
{char shunxu[8]={'s','b','A','(','B','a',')','$'};
 int i=0,j=0;
 while(i<8)
 {
	 if(p->L[p->top]==shunxu[i])
		 break;
	 else
		 i=i+1;
 }
 while(j<8)
 {
	 if(L[t]==shunxu[j])
		 break;
	 else
		 j=j+1;
 }
 if(fenxibiao[i][j]=='#')
	 return 0;
 else
	 if(fenxibiao[i][j]=='<')
		 return 1;
	 else
		 if(fenxibiao[i][j]=='=')
			 return 2;
		 else
			 return 3;
}




int panduan2(zhan *p)
{char shunxu[8]={'s','b','A','(','B','a',')','$'};
 int i=0,j=0;
 while(i<8)
 {
	 if(p->L[p->top-1]==shunxu[i])
		 break;
	 else
		 i=i+1;
 }
 while(j<8)
 {
	 if(p->L[p->top]==shunxu[j])
		 break;
	 else
		 j=j+1;
 }
 if(fenxibiao[i][j]=='#')
	 return 0;
 else
	 if(fenxibiao[i][j]=='<')
		 return 1;
	 else
		 if(fenxibiao[i][j]=='=')
			 return 2;
		 else
			 return 3;
}




void print(zhan *p,char L[10],int t)
{int i,j;
 printf("\n");
 for(i=0;i<=p->top;i++)
	 printf("%c",p->L[i]);
 printf("       ");
 for(j=t;L[j]!='\0';j++)
	 printf("%c",L[j]);
}





void main()
{zhan fenxizhan;
 zhan *s;
 s=&fenxizhan;
 zhichuzhan(s);
 char shuruliu[10];
 printf("请输入要分析的语句(以'$'结束): ");
 scanf("%s",shuruliu);
 int ip=0;
 print(s,shuruliu,ip);/////////
 int k;
 char L1[10],L2[10];
 while(shuruliu[ip]!='\0')
 {
	 if(s->top==1&&s->L[s->top]=='S'&&shuruliu[ip]=='$')
	 {//print(s,shuruliu,ip);////////
	  printf("\n分析完成,您输入的语句符合文法\n");
	  break;
	 }
	 else
	 {k=panduan1(s,shuruliu,ip);//
      if(k==0)
	  {printf("\n您输入的语句不符合文法\n");
       break;
	  }
      if(k==1||k==2)
	  {s->top=s->top+1;
       s->L[s->top]=shuruliu[ip];
	   ip=ip+1;
	   print(s,shuruliu,ip);////////
	   continue;
	  }
	  if(k==3)
	  {   int i=0,j=0,t=0;
		  while(1)
		  {k=panduan2(s);//
		   if(k==1)
		   {L1[i]=s->L[s->top];
		    L1[i+1]='\0';
			break;
		   }
		   else
		   {L1[i]=s->L[s->top];
            i=i+1;
			s->top=s->top-1;
		   }    
		  }
		  while(i>=0)
		  {L2[j]=L1[i];
		   j=j+1;
		   i=i-1;
		  }
		  L2[j]='\0';
          while(t<4)
		  {
			  if(strcmp(chanshengshi[t],L2)==0)
				  break;
			  else
				  t=t+1;
		  }
		  if(t==0)
		  {s->L[s->top]='S';
		   print(s,shuruliu,ip);////////
		   printf("      S->%s",&L2);
		  }
		  else
			  if(t==1||t==2)
			  {s->L[s->top]='A';
			   print(s,shuruliu,ip);////////
			   printf("      A->%s",&L2);
			  }
			  else
				  if(t==3)
				  {s->L[s->top]='B';
				   print(s,shuruliu,ip);////////
				   printf("      B->%s",&L2);
				  }
				  else
				  {printf("\n您输入的语句不符合文法\n");
				   break;
				  }
	  }
	 }
  
 }
 if(shuruliu[ip]=='\0')
	 printf("\n您输入的语句不符合文法\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -