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

📄 2.cpp

📁 本程序实现了预测分析表法分析文法的功能。
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
char ch;//读入字符串数组
int i=1;
int total=0;//统计步数
char a1[10],a2[10],a3[10];char c1='n';
void fengxi()
{   int m,k1,k2,j1,j2;char c[3]={'+','*','i'};
	char b[8][4]={'E','T','e',' ',//把所有的终结符和非终接符写入数组
		          'e','+','T','e',
				  'e',' ',' ',' ',
				  'T','F','t',' ',
				  't','*','F','t',
				  't',' ',' ',' ',
				  'F','(','E',')',
				  'F','i',' ',' ',};
for( j1=0;j1<8;j1++)//先扫一遍看CH在数组的哪一行
  for( j2=0;j2<4;j2++)
	  if(b[j1][j2]==ch)
		  m=j1;
   for( j1=1;j1<10;j1++)//进行自上而下推导
	    for(j2=0;j2<8;j2++)
			if(a1[j1]==b[j2][0])
			{  
				for(int j3=1;j3<4;j3++)
				{
					if(b[j2][j3]=='+') c1='+';
					if(b[j2][j3]=='*') c1='*';
					if(b[j2][j3]=='i') c1='i';
				}
				if(c1!=ch&&c1!='n') 
				{ c1='n';     break;}
				k1=j1;k2=j2;
                goto a;
			}
a: for(j1=1;j1<10;j1++) //看是否有与含ch的数组相符
	   if(a1[j1]==b[m][0])
	   {k1=j1;k2=m;}
   for(j1=k1;j1<10;j1++)//把所要替换的字符放到数组的最后
   {   
	   if(a1[j1+1]!=' ')
	       a1[j1]=a1[j1+1];
      else 
	  {
	   a1[j1]=b[k2][0];
	   break;
	  }
   }
   for(j2=1;j2<4;j2++)//进行替换
   {
        a1[j1]=b[k2][j2];
		j1++;
   }
   if(k2==0)  strcpy(a3,"E->Te");//把产生式写入a3
   if(k2==1)  strcpy(a3,"e->+Te");
   if(k2==2)  strcpy(a3,"e->^");
   if(k2==3)  strcpy(a3,"T->Ft");
   if(k2==4)  strcpy(a3,"t->*Ft");
   if(k2==5)  strcpy(a3,"t->^");
   if(k2==6)  strcpy(a3,"F->(E)");
   if(k2==7)  strcpy(a3,"F->i");

}

void print()//打印函数
{
	printf("%d\t\t%s\t\t%s\t%s\n",total,a1,a2,a3);
	total++;
	strcpy(a3," ");
}

int panduan()//
{
 for(int j1=1;j1<10;j1++)
	 if(a1[j1]==ch) 
	 {   
		 for(int j2=j1;j2<10;j2++)
		 {   
			 if(a1[j2+1]!=' ')
	              a1[j2]=a1[j2+1];
            else {a1[j2]=' ';break;}
		 }
		 return 1;
	 }
	return 0;
}

void zifu()
{int t1,t2=1,t3=1;
if(panduan()==1)
{
	ch=a2[i];
	a2[i-1]=' ';
	i++;
	print();
}
else
{
	fengxi();print();
}
for(int j1=1;j1<10;j1++)//判断a1里面是否全为et字符
{
	if(a1[j1]!='t'&&a1[j1]!='e'&&a1[j1]!=' ')
	{t2=0;}

	if(a1[j1]==' ')
	{t1=j1+1;break;}
}
for(j1=0;j1<10;j1++)
 if(a2[j1]!=' '&&a2[j1]!='#')
	  t3=0;

if(t2==1&&t3==1)
{
  for(j1=1;j1<t1;j1++)
  {   if(j1!=1)
	  print();
	  for(int j2=1;j2<t1;j2++)
	  {
		  if(a1[j2+1]!=' ')
			  a1[j2]=a1[j2+1];
		  else {a1[j2]=' ';break;}
	  }  
	  if(a1[1]=='e') strcpy(a3,"e->^");
	  if(a1[1]=='t') strcpy(a3,"t->^");
  }
}
}




void main()
{   
   strcpy(a1,"#E         ");
	for(int j1=2;j1<10;j1++)
	{
		
		a2[j1]=' ';
	}
	int j=0;
	printf("请输入你要分析的字符串:(以#号结束)\n");
	do
	{
		scanf("%c",&ch);
		a2[j]=ch;
		j++;
	}while(ch!='#');
	ch=a2[0];
    printf("步骤\t\t符号栈\t\t\t输入串\t\t所用产生式\n");
	print();
	 do
	{
		zifu();
	}while(ch!='#');
	printf("分析成功!!");
 

}

⌨️ 快捷键说明

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