语义分析程序

学习总结 专栏收录该内容
10 篇文章 0 订阅

一:总体设计思路。

   先分析简单语言的词法,也就是识别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
    评论
  • 12
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
毕业论文引言 随着计算机技术的发展与普及,计算机已经成为各行业最基本的工具之一,迅速进入千家万户。因此,掌握计算机应用的基本技能成为新世纪人才不可缺少的基本素质之一。为使计算机能正常工作, 除了构成计算机各个组成部分的物理设备外, 一般说来, 还必须要有指挥计算机“做什么”和“如何做”的“程序”。程序及其有关文档构成计算机软件, 其中用以书写计算机软件的语言称为计算机程序设计语言。 1 计算机程序设计语言简介 计算机程序设计语言是计算机可以识别的语言,用于描述解决问题的方法,供计算机阅读和执行,通常简称为编程语言,是一组用来定义计算机程序的语法规则。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。使用程序设计语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为所有的程序都需要程序设计语言才能完成,而计算机的工作是用程序来控制的,离开了程序,计算机将一事无成。 2 开发背景及意义 现有计算器不能计算表达式,这是一个缺陷,为此,开发了一个能直接计算表达式的计算器,这为计算提高了更大的方便,可以大幅度提高计算效率。 第二章 第三章 第一节 递归下降法的描述 3.1.1实现思想 它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。文法中每个非终结符对应一个递归过程(子程序),每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时能够按LL(1)形式可唯一地确定选择某个候选式进行推导。 3.1.2算法的特点 递归下降法是语法分析中最易懂的一种方法。递归下降法要满足的条件:假设A的全部产生式为Aα1|α2|……|αn ,则必须满足如下条件才能保证可以唯一的选择合适的产生式 predict(Aαi)∩predict(Aαj)=Φ,当i≠j. 3.1.3构造递归下降语法分析程序 采用了递归子程序方法进行语法分析,对文法中的每个非终极符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。每次进入子程序之前都预先读入一个单词。因为使用了递归下降方法,所以程序结构和层次清晰明了,易于手工实现,且时空效率较高。实际的语法分析工作,从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。 第二节
附录c 编译程序实验 实验目的:用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 语法分析 C2.1 实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析. C2.2 实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析. C2.2.1待分析的简单语言的语法 实验目的 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法. 实验要求 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 实验的输入和输出 输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。 例如:对于语句串 begin a:=2+3*4;x:=(a+b)/c end# 输出的三地址指令如下: (1) t1=3*4 (2) t2=2+t1 (3) a=t2 (4) t3=a+b (5) t4=t3/c (6) x=t4 算法思想 1设置语义过程 (1) emit(char *result,char *arg1,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)主程序示意图如图c.10所示。 (2) 函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。 语义分析程序的C语言程序框架 int lrparser() { int schain=0; kk=0; if(syn=1) { 读下一个单词符号; schain=yucu; /调用语句串分析函数进行分析/ if(syn=6) { 读下一个单词符号; if(syn=0 && (kk==0)) 输出(“success”); } else { if(kk!=1 ) 输出 ‘缺end’ 错误;kk=1;} else{输出’begin’错误;kk=1;} } return(schain); int yucu() { int schain=0; schain=statement();/调用语句分析函数进行分析/ while(syn=26) {读下一个单词符号; schain=statement(); /调用语句分析函数进行分析/ } return(schain); } int statement() { char tt[8],eplace[8]; int schain=0; {switch(syn) {case 10: strcpy(tt,token); scanner(); if(syn=18) {读下一个单词符号; strcpy(eplace,expression()); emit(tt,eplace,””,””); schain=0; } else {输出’缺少赋值号’的错误;kk=1; } return(schain); break; } } 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 ());/调用term分析产生表达式计算的第一项eplace/ while(syn=13 or 14) { 操作符 tt= ‘+’或者‘—’; 读下一个单词符号; strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/ strcpy(tp,newtemp());/调用newtemp产生临时变量tp存储计算结果/ emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/ strcpy(eplace,tp); } return(eplace); } char *term(void)/仿照函数expression编写/ char *factor
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值