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

📄 yufa.cpp

📁 给大家一些有关编译原理的程序
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#define N 6
char s[30];
int l=0;
char a,X;
char VN[4]={'S','H','M','A'};
char VT[4]={'a','d','b','e'};
int q=0;
char chuan[N];
struct FXB
{ char C[5];
}M[4][5]={{"aH","\0","\0","\0","\0"},{"aMd","d","\0","\0","\0"},{"Ab","!","!","Ab","\0"},{"aM","\0","\0","e","\0"}};

int chashu(char A[])
{  int i=0;
  while(A[i]!='\0')
	  i++;
 return i-1;
}
 void insertstack(char A[])
  { int p;
	 p=chashu(A);
	 while(p>=0&&A[p]!='!')
  {  l++;
    s[l]=A[p];
	
	p--;
  }
 }
void printfstack()
{ int m=0;
   printf("\t");
	while(s[m]!='\0'&&m<=l+1)
			 {printf("%c",s[m]);
	          m++;
			 }
	printf("\t");
 }
void print()
{ int i=q;
   printf("\t");
	while(chuan[i]!='\0')
	{   
		printf("%c",chuan[i]);
		i++;
	}
	printf("\t");
}

 int chabiao()
{  int i,j,m,n;
   for(j=0;j<4;j++)
	   if(X==VN[j])
		   m=j;
   for(i=0;i<4;i++)
	   if(a==VT[i])
		   n=i;
  if(M[m][n].C[0]!='\0')
	   { insertstack(M[m][n].C);
         	
          return 1;
	   }
   else
  {printf("M[X][a]不是产生式,出错");
    return 0;
		}
}
  void popstack()
  { X=s[l];
    l--;
  }
void main()
{ 
  int t=1,i,j=1;
  printf("请输入分析串:\n");
  for(i=0;i<N;i++)
    scanf("%c",&chuan[i]);
  s[0]='#';
  s[1]='S';
  l=1;
 printf("步骤\t分析栈\t\t剩余输入串\t推导用产生式或匹配\n");
printf("%d  ",j);

  while(t==1)
  { 
    
	  popstack();
   printfstack();
 print();
      a=chuan[q];
     for(i=0;i<4;i++)
	   if(X==VT[i])
	   {   if(X==a)
	   {    printf("\t'%c'匹配",a); 
		     q++;
         
	          break;}
		   else 
		   { printf("不匹配,不是G[S]的句子");
		     t=0;
			 break;
		   }
	   }
	  if(i==4)
		   if(X=='#')
		       if(X==a)
			   {printf("分析成功");
			    t=0;
			     break;
			   }
			   else
               { printf("不匹配");
			   t=0;
			   }
			else
				t=chabiao();
      j++;
  printf("\n%d   ",j);
	
  }
 
}

   

⌨️ 快捷键说明

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