语义分析程序

来源:互联网 发布:gta5美女捏脸详细数据 编辑:程序博客网 时间:2024/05/16 15:55

一:总体设计思路。

   先分析简单语言的词法,也就是识别c语言中各单词符号对应的种别码;再用递归下降分析发进行语法分析,需要文法成功;之后采用递归下降语法制导翻译技术,在语法的基础上进行语义动作:将输入串翻译成四元式序列。


二:语义分析

   在语法分析的基础上,将输入串翻译成四元式序列。

  算法思想:

1、设置语义过程。

(1)emit(char*result,char *ag1,char *op,char *ag2)

该函数的功能是生成一个三地址语句送到四元式表中。

四元式表的结构如下:

struct

{     char result[8];

char ag1[8];

char op[8];

char ag2[8];

}quad[20];

 (2) char *newtemp()

该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…

char *newtemp(void)

{     char *p;

             char  m[8];

             p=(char *)malloc(8);

              k++;

             itoa(k,m,10);

             strcpy(p+1,m);

             p[0]=’t’;

             return(p);

}

2、函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。


三:附源程序代码

#include "stdio.h"

#include "string.h"

 

char prog[100],token[8],ch;

char *rwtab[6]={"begin","if","then","while","do","end"};

int syn,p,m,n,sum,q;

int kk;

struct { char result1[8];

   char ag11[8];

    char op1[8];

    char ag21[8];

  } quad[20];

 

char *factor();

char *expression();

int yucu();

char *term();

int statement();

int lrparser();

char *newtemp();

scaner();

emit(char *result,char *ag1,char*op,char *ag2);

 

 

main()

{ int j;

 q=p=kk=0;

 printf("\n**************************************");

 printf("\nplease input a string (end with'#'): ");

 do

  { scanf("%c",&ch);

     prog[p++]=ch;

  }while(ch!='#');

 p=0;

 scaner();

 lrparser();

if(q>19)printf(" too longsentense!\n");

else for(j=0;j<q;j++)printf("   %s = %s%s %s \n\n",quad[j].result1,quad[j].ag11,quad[j].op1,quad[j].ag21);

getch();

}

 

 

int lrparser()

  { int schain=0;

    kk=0;

   if (syn==1)

      { scaner();

 schain=yucu();

 if(syn==6)

 { scaner();

   if((syn==0)&&(kk==0)) printf("Success!\n");

 }

 else { if(kk!=1)printf("short of 'end'!\n");

        kk=1;

        getch();

        exit(0);

      }

      }

   else { printf("short of 'begin' !\n");

   kk=1;

   getch();

   exit(0);

 }

   return (schain);

}

 

 

int yucu()

{ int schain=0;

 schain=statement();

 while(syn==26)

  { scaner();

     schain=statement();

  }

 return (schain);

}

 

 

int statement()

{ char tt[8],eplace[8];

 int schain=0;

 if (syn==10)

  { strcpy(tt,token);

     scaner();

     if(syn==18)

       { scaner();

 strcpy(eplace,expression());

 emit(tt,eplace,"","");

 schain=0;

 }

     else { printf("short of sign ':='!\n");

     kk=1;

     getch();

    exit(0);

   }

   return (schain);

  }

}

 

 

char *expression()

{ 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)strcpy(tt,"+");

     else strcpy(tt,"-");

     scaner();

     strcpy(ep2,term());

     strcpy(tp,newtemp());

     emit(tp,eplace,tt,ep2);

     strcpy(eplace,tp);

  }

 return (eplace);

}

 

 

char *term()

{ 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();

     strcpy(ep2,factor());

     strcpy(tp,newtemp());

     emit(tp,eplace,tt,ep2);

     strcpy(eplace,tp);

  }

 return (eplace);

}

 

 

char *factor()

{ char *fplace;

 fplace=(char *)malloc(12);

 strcpy(fplace,"");

 if(syn==10)

  { strcpy(fplace,token);

     scaner();

  }

 else if(syn==11)

  { itoa(sum,fplace,10);

     scaner();

  }

 else if(syn==27)

  { scaner();

     fplace=expression();

     if(syn==28) scaner();

     else { printf("error on ')'!\n");

     kk=1;

     getch();

     exit(0);

  }

  }

 else { printf("error on '(' !\n");

 kk=1;

 getch();

 exit(0);

       }

 return (fplace);

}

 

 

char *newtemp()

{ char *p;

 char m[8];

 p=(char *)malloc(8);

 kk++;

 itoa(kk,m,10);

 strcpy(p+1,m);

 p[0]='t';

 return(p);

 }

 

 

scaner()

 { sum=0;

   for(m=0;m<8;m++)token[m++]=NULL;

   m=0;

   ch=prog[p++];

   while(ch==' ')ch=prog[p++];

   if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

      {while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

  {token[m++]=ch;

   ch=prog[p++];

  }

      p--;

      syn=10;

      token[m++]='\0';

      for(n=0;n<6;n++)

 if(strcmp(token,rwtab[n])==0)

   { syn=n+1;

      break;

   }

      }

   else if((ch>='0')&&(ch<='9'))

      {while((ch>='0')&&(ch<='9'))

 { sum=sum*10+ch-'0';

  ch=prog[p++];

 }

 p--;

 syn=11;

      }

   else switch(ch)

       { case '<':m=0;

   ch=prog[p++];

   if(ch=='>')

      { syn=21;

      }

   else if(ch=='=')

      { syn=22;

      }

   else

      { syn=20;

         p--;

      }

   break;

 case '>':m=0;

   ch=prog[p++];

   if(ch=='=')

      { syn=24;

      }

   else

      { syn=23;

        p--;

      }

   break;

 case ':':m=0;

   ch=prog[p++];

   if(ch=='=')

      { syn=18;

      }

   else

      { syn=17;

        p--;

      }

   break;

 case '+': syn=13; break;

 case '-': syn=14; break;

 case '*': syn=15;break;

 case '/': syn=16;break;

 case '(': syn=27;break;

 case ')': syn=28;break;

 case '=': syn=25;break;

 case ';': syn=26;break;

 case '#': syn=0;break;

 default: syn=-1;break;

       }

   }

 

emit(char *result,char *ag1,char*op,char *ag2)

{

strcpy(quad[q].result1,result);

strcpy(quad[q].ag11,ag1);

strcpy(quad[q].op1,op);

strcpy(quad[q].ag21,ag2);

q++;

}

 

 



0 0
原创粉丝点击