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

📄 1.c

📁 语法分析的源程序!!!编译原理 试验用的到的程序C语言的!
💻 C
字号:
/*这是编译原理的一个作业题,是作语法分析的.建表是手工的,因此具有些局限性,不过可以给大家参考。*/
#include<stdio.h>
main()
{
 char b[100],a[50];
 int k,j,p,i,v,t;
 int q1,q2,q3,q4,q5,f;
 char c[6][7]=; /*建的语法分析表,语法如下:E::TH;H::+TH;H::空;T::FI;I::*FI;I::空;F::i;F::(E).0表示空,N表示出错*/
    char sting1[5]=;
  char sting2[5]=;
 char sting3[5]=;
 char sting4[5]=;
 char sting5[5]=;/*设置字符串以供比较之用*/
loop:
 k=0;
 j=0;
 p=0;
 k=0;
 i=0;
 f=0;
 q2=0;
 v=0;
 t=0;
   printf("输入要验证的字符,只包括'+','i','*','(',')',以#号结束: ");
 while(b[i-1]!='#'&&b[i-1]!=' ')/*输入语句*/
 {
  scanf("%c",&b[i]);
      i++;
 }

  for(q1=0;q1<i;q1++)
 {
  if(b[q1]!='i'&&b[q1]!='+'&&b[q1]!='*'&&b[q1]!='('&&b[q1]!=')'&&b[q1]!='#')
   goto exit;/*看输入是否有非法字符*/
 }
  a[p]='#';
    p++;
 a[p]='E';/*从E开始推*/
loop1:
 k=0;j=0;
 while(c[k][0]!=a[p])
 {
  k++;
 if(a[p]=='#')
  goto loop3;
 }
  while(c[0][j]!=b[f]&&j<7)
  j++;/*查表*/
/*以下是推导过程*/

if(c[k][j]=='1'||c[k][j]=='2'||c[k][j]=='3'||c[k][j]=='4'||c[k][j]=='5')
switch(c[k][j])/*和字符串匹配*/
{
case'1':/*和sting1匹配*/
 {
  q1=1;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting1[q2];
         q1--;
         q2++;
  }
 }break;
case'2':/*和sting2 匹配*/
 {
  q1=2;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting2[q2];
         q1--;
      q2++;
  }
 }break;
case'3':/*和sting3匹配*/
 {
  q1=1;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting3[q2];
         q1--;
         q2++;
  }
 }break;
case'4':/*和sting4匹配*/
 {
  q1=2;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting4[q2];
         q1--;
         q2++;
  }
 }break;
case'5':/*和sting5匹配*/
 {
  q1=2;
     q2=0;
  p--;
  while(q1>=0)
  {
   p++;
   a[p]=sting5[q2];
         q1--;
      q2++;
  }
 }break;
}
/*和单字符匹配*/
 if(c[k][j]=='N')
  goto exit;
 else if(c[k][j]=='0')
 { p--;
 goto loop1;}
 else if(c[k][j]=='i')
  a[p]=c[k][j];
 if(a[p]=='i'||a[p]=='+'||a[p]=='*'||a[p]=='('||a[p]==')')
 {
  if(a[p]==b[f])
  {p--;
  f++;
  goto loop1;
  }
  else
           goto exit;
 }
 else if(a[p]=='E'||a[p]=='H'||a[p]=='T'||a[p]=='I'||a[p]=='F')
   goto loop1;/*反复,直到结束*/
 else if(a[p]=='#')
  {
loop3:   if(a[p]==b[f])
   { v=1;
    goto exit;
   }
   else
    goto exit;
  }
   else
    goto exit;

exit:
   if(v==1)
    printf("识别成功 ");
   else
    printf("出错,有可能是没有以#结束,语法不正确,或者输入了其它字符 ");
   getchar();
} 

⌨️ 快捷键说明

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