实验二完美程序设计.c

来自「赋值语句的翻译程序设计 .设计」· C语言 代码 · 共 239 行

C
239
字号
/* Note:Your choice is C IDE */
#include<stdio.h>
#include<string.h>
struct{
  char *result;
  char *ag1;
  char *op;
  char *ag2;
}quad[20];
char prog[80],token[8];
char ch;
int syn,p,m,n;
int kk=0;
int k=0;
int schain=0;
char *newtemp();
void emit();
int scaner();
int lrparser();
int yucu();
int statement();
char *expression(void);
char *term(void);
char *factor(void);
char *rwtab[6]={"begin","if","then","while","do","end"};
void main()
{
  p=0;
  printf("Please input code and end with character '#':\n");
   do{
   ch=getchar();prog[p++]=ch;
   }while(ch!='#');
   p=0;
  scaner(prog); 
  lrparser(); 
}

char *newtemp()
{ char *p;
  char m[8];
  p=(char *)malloc(8);
  k++;
  itoa(k,m,10);
  strcpy(p+1,m);
  p[0]='t';
  return(p);
}

void emit(char *result,char *ag1,char *op,char *ag2)
{ int i;i=0;
  while(quad[i].result!=NULL)
       i++;
  quad[i].result=result;
  quad[i].ag1=ag1;
  quad[i].op=op;
  quad[i].ag2=ag2;
  printf("%s=%s%s%s\n",quad[i].result,quad[i].ag1,quad[i].op,quad[i].ag2);
}

int scaner(char prog[])
{
  int i;
  for(m=0;m<8;m++) token[m]=NULL;
  m=0; ch=prog[p++];
  while(ch==' ') ch=prog[p++];
  if((ch>='a')&&(ch<='z'))
    {  while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')))
         {token[m++]=ch;ch=prog[p++];} token[m++]='\0'; n=0;
       for(i=0;i<6;i++)
        if(strcmp(token,rwtab[i])==0)
   switch(i)
            {
              case 0: syn=1;n++;break;
              case 1: syn=2;n++;break;
              case 2: syn=3;n++;break;
              case 3: syn=4;n++;break;
              case 4: syn=5;n++;break;
              case 5: syn=6;n++;break;
             }
         if(n==0) syn=10;p--;
    }
    else if(ch>='0'&&ch<='9')
         {n=0;while(ch>='0'&&ch<='9') {n=n*10+(ch-'0');ch=prog[p++];}
          syn=11; p--;
         }
    else switch(ch)
    {  case'<': token[m++]=ch;ch=prog[p++];
                if(ch=='>')
                {token[++m]=ch;syn=22;}
                else if(ch=='=')
                     {token[++m]=ch;syn=21;}
                else{p--;syn=20;} break;
       case'>': token[m]=ch;ch=prog[p++];
                if(ch=='='){token[++m]=ch;syn=24;}
                else{p--;syn=23;} break;
       case '+': token[m]=ch;syn=13;break;
       case '-': token[m]=ch;syn=14;break;
       case '*': token[m]=ch;syn=15;break;
       case '/': token[m]=ch;syn=16;break;
       case ':': token[m++]=ch;ch=prog[p++];
                 if(ch=='='){token[m++]=ch;syn=18;}
                 else{p--;syn=17;}break;
       case '=': token[m]=ch;syn=25;break;
       case ';': token[m]=ch;syn=26;break;
       case '(': token[m]=ch;syn=27;break;
       case ')': token[m]=ch;syn=28;break;
       case '#': syn=0;token[0]='#';break;
       default: syn=-1;break;}
       return syn;
}

int lrparser()
{ int schain=0;
	kk=0;
  if(syn==1)
  { syn=scaner(prog);
    schain=yucu();
    if(syn==6)
    { syn=scaner(prog);
      if(syn==0&&kk==0)
      printf("success");
    }
    else if(kk!=1) {printf("'end'lack");kk=1;}
  else{ printf("'begin'error");kk=1;}
  }
}

int yucu()
{ int schain=0;
  schain=statement();
  while(syn==26)
     { scaner(prog);
       schain=statement();
     }
  return(schain);
}

int statement()
{ char tt[8],eplace[8];
  int schain=0;
  switch(syn)
  { case 10:strcpy(tt,token);
     scaner(prog);
     if(syn==18)
       { scaner(prog);
  strcpy(eplace,expression());
  emit(tt,eplace,"","");
  schain=0;
       }
     else
       { printf("lack'=:'");
  kk=1;
       }
     return(schain);

   }
}

char *expression(void)
{ char *tp,*ep2,*eplace,*tt;
  tp=(char *)malloc(12);
  ep2=(char *)malloc(12);
  eplace=(char *)malloc(12);
  tt=(char *)malloc(12);
  strcpy(eplace,term());
  while(syn==13||syn==14)
    { if(syn==13)
  tt="+";
      else
  tt="-";
       scaner(prog);
       strcpy(ep2,term());
       strcpy(tp,newtemp());
       emit(tp,eplace,tt,ep2);
       strcpy(eplace,tp);
    }
  return(eplace);
}

char *term(void)
{ char *tp,*ep2,*eplace,*tt;
  tp=(char *)malloc(12);
  ep2=(char *)malloc(12);
  eplace=(char *)malloc(12);
  tt=(char *)malloc(12);
  strcpy(eplace,factor());
  while((syn==15)||(syn==16))
       { if(syn==15) strcpy(tt,"*");
  else strcpy(tt,"/");
  scaner(prog);
  strcpy(ep2,factor());
  strcpy(tp,newtemp());
  emit(tp,eplace,tt,ep2);
  strcpy(eplace,tp);
       }
  return eplace;
}

char *factor(void)
{ char *fplace;
  fplace=(char *)malloc(10);
  strcpy(fplace,"");
  if(syn==10)
    { strcpy(fplace,token);
      scaner(prog);
    }
  else if(syn==11)
    { itoa(n,fplace,10);
      scaner(prog);
    }
  else if(syn==27)
    { scaner(prog);
      fplace=expression();
      if(syn==28)
 scaner(prog);
      else
       { printf("')'error");
  kk=1;
       }
    }
  else
    { printf("'('error");
      kk=1;
    }
  return(fplace);
}












⌨️ 快捷键说明

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