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

📄 cpp1.cpp

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



typedef struct
{char s[5];
}node;
node fenxibiao[5][6]={{{"Te"},{"#"},{"#"},{"Te"},{"#"},{"#"}},{{"#"},{"+Te"},{"#"},{"#"},{"@"},
{"@"}},{{"Ft"},{"#"},{"#"},{"Ft"},{"#"},{"#"}},{{"#"},{"@"},{"*Ft"},{"#"},{"@"},{"@"}},{{"d"},
{"#"},{"#"},{"(E)"},{"#"},{"#"}}};





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





char chanshengshi[5];





void set(zhan *p)
{p->top=0;
 p->L[p->top]='$';
 p->top=1;
 p->L[p->top]='E';
}





int panduan1(zhan *p,char a[5])
{int i=0;
 while(i<5)
 {if(p->L[p->top]==a[i])
      break;
  else
	  i=i+1;
 }
 if(i==5)
	 return 0;
 else
	 return 1;
}





int panduan2(zhan *p,char a[10],int t,char c[6])
{char b[5]={'E','e','T','t','F'};
 int i=0;
 while(i<5)
 {if(b[i]==p->L[p->top])
      break;
  else
	  i=i+1;
 }
 int j=0;
 while(j<6)
 {if(c[j]==a[t])
      break;
  else
	  j=j+1;
 }
 if(strcmp(fenxibiao[i][j].s,"#")==0)
	 return 0;
 else
 {strcpy(chanshengshi,fenxibiao[i][j].s);
  return 1;
 }
}





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





void fanyazhan(zhan *p)
{
	if(strcmp(chanshengshi,"@")!=0)
	{int i=0;
     while(chanshengshi[i]!='\0')
	       i=i+1;
     i=i-1;
     while(i>=0)
	 {p->top=p->top+1;
      p->L[p->top]=chanshengshi[i];
	  i=i-1;
	 }
	}
}






void main()
{char zhongjifu[6]={'d','+','*','(',')','$'};
 printf("终结符:");
 int j;
 for(j=0;j<5;j++)
	 printf("%c",zhongjifu[j]);
 printf("\n");
 printf("请输入要分析的语句:");
 char shuruliu[10];
 scanf("%s",shuruliu);
 zhan fenxizhan;
 zhan *s;
 s=&fenxizhan;
 set(s);
 int ip=0;//指向输入流头元素的指针
 int t;//判断栈顶元素是否为终结符的标志
 int k;//判断分析表中对应位置是否为空的标志
 print(s,shuruliu,ip);
 printf("\n");
 while(s->L[s->top]!='$')
 {t=panduan1(s,zhongjifu);
  if(t||s->L[s->top]=='$')
	  if(s->L[s->top]==shuruliu[ip])
	  {s->top=s->top-1;
	   ip=ip+1;
	   print(s,shuruliu,ip);
	   printf("\n");
	  }
	  else
	  {printf("错误\n");
	   printf("语句:%s不符合文法\n",shuruliu);
	   break;
	  }
  else
  {k=panduan2(s,shuruliu,ip,zhongjifu);
   if(k)
   {s->top=s->top-1;
    fanyazhan(s);
	print(s,shuruliu,ip);
	printf("    %s",chanshengshi);
	printf("\n");
   }
   else
   {printf("错误\n");
	printf("语句:%s不符合文法\n",shuruliu);
	break;
   }
  }
 }
 if(s->L[s->top]=='$')
     printf("分析完成,语句%s符合文法\n",shuruliu);
}

⌨️ 快捷键说明

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