您好,欢迎访问三七文档
编译原理实验报告——表达式语法分析表达式语法分析实验报告一、实验题目设计一个简单的表达式语法分析器(采用递归下降方法设计实现)二、实验目的1、了解形式语言基础及其文法运算;2、熟悉语法分析原理及4种常用的语法分析方法;其中:四种算法为(1)设计算术表达式的递归下降子程序分析算法(2)设计算术表达式的LL(1)分析算法(3)设计算术表达式的简单优先分析算法(4)设计算术表达式的SLR(1)分析算法3、选择上述一种方法并设计一个表达式的语法分析器。(本实验设计的是递归下降的表达式语法分析器)三、实验内容1.设计递归下降语法分析器算法;2.编写代码并上机调试运行通过;3、写出试验体会及心得。四、实验要求1、给出算术表达式文法2、进行适当的文法变换3、选择一种语法分析的方法,并说明其原理4、根据原理给出相应的算法设计,说明主要的数据结构并画出算法流程图5、编写代码并上机调试运行通过6、写出程序运行结果7、写出相应的文档以及代码注释8、输入——表达式;输出——表达式语法是否正确。五、递归下降的表达式语法分析器设计概要1.算术表达式文法G(E):EE+T|TTT*F|FFi|(E)2.文法变换:G’(E):E-TE'E'-+TE'|εT-FT'T'-*FT'|εF-(E)|I3.递归下降子程序框图:六、实验设计源程序#includeiostream.hcharinputstream[50];//存储输入句子inttemp=0;//数组下标intright;//判断输出信息voide();voide1();voidt();voidt1();voidf();voidmain(){right=1;cout请输入您要分析的字符串以#结束(^为空字符):endl;cininputstream;e();if((inputstream[temp]=='#')&&right)cout分析成功endl;elsecout分析失败endl;}voide(){coutE-TE'endl;t();e1();}voide1(){if(inputstream[temp]=='+'){coutE'-+TE'endl;temp++;t();e1();}elseif(inputstream[temp]!='#'||inputstream[temp]!=')'){coutT'-^endl;return;}elseright=0;}voidt(){coutT-FT'endl;f();t1();}voidt1(){if(inputstream[temp]=='*'){coutT'-*FT'endl;temp++;f();t1();}elseif(inputstream[temp]!='#'&&inputstream[temp]!=')'&&inputstream[temp]!='+'){coutT'-^endl;right=0;}}voidf(){if(inputstream[temp]=='i'){coutF-iendl;temp++;}elseif(inputstream[temp]=='('){coutF-(E)endl;temp++;e();if(inputstream[temp]==')'){coutF-(E)endl;temp++;}elseright=0;}elseright=0;}七、运行结果八、实验思考题语法分析的任务是什么?答:语法分析器的任务是识别和处理比单词更大的语法单位,如:程序设计语言中的表达式、各种说明和语句乃至全部源程序,指出其中的语法错误;必要时,可生成内部形式,便于下一阶段处理。九、实验体会通过此次实验,让我了解到如何设计、编写并调试语法分析部分的相关程序,并加深对语法分析原理的理解;熟悉了构造语法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,通过本次实验,也让我重新熟悉了C++语言的相关内容,加深了对C++语言知识的深化和用途的理解。表达式中间代码生成一、实验题目表达式中间代码生成二、实验目的熟悉算术表达式的语法分析与中间代码生成原理。三、实验内容1.构造算术表达式的四元式翻译文法2.设计算术表达式的递归下降子程序分析算法3.设计算术表达的四元式生成算法4.实现代码并调试运行四、实验要求1、采用递归下降语法制导翻译法,对算术表达式,赋值语句进行语义分析并生成四元式序列.2、输入是语法分析后提供的正确的单词串,输出四元式序列.例如:对于语句串Begina:=2+3*4;x:=(a+b)/cend#输出的指令如下:(1)t1=3*4(2)t2=w+t1(3)a=t2(4)t3=a+b(5)t4=t3/c(6)x=t4五、设计原理1、原文法:EVA_SENTENCEid:=EEEω0TETTTω1FTFFidFconsF(E)其中:id——标识符;cons——常数。2、属性文法G’(E):产生式语义规则规则编码EVA_SENTENCEid:=EQUAT(:=);EEω0TQUAT(ω0);(1)E.place:=ti.entry;ETE.place:=T.placeTTω1FQUAT(ω1);(1)T.place:=ti.entry;TFT.place:=F.placeFidF.place:=id.entry(2)FconsF.place:=cons.entry(2)F(E)F.place:=E.place(3)其中:(1)QUAT(:=)——生成一个赋值四元式;i.(:=,E.place,_,id.entry);ii.j++;(2)QUAT(ω0)——生成一个运算四元式;i.ti:=newt(i);//申请一个临时变量ii.(ω0,E.place,T.place,ti.entry);iii.j++;(3)QUAT(ω1)——类似QUAT(ω0)。i.ti:=newt(i);//申请一个临时变量ii.(ω1,T.place,F.place,ti.entry);iii.j++;六、程序设计的算法思想1、设置语义过程Emit(char*result,char*ag1,char*op,char*ag2)该函数的功能是生成一个三地址语句送到四元式表达中.2、四元式表达的结构如下:Struct{Charresult[8];Charag1[8];Charop[8];Charag2[8];}quad[20]Char*newtemp()该函数回送一个新的临时变量名,临时变量名产生的顺序为t1,t2,….3、算法设计:七、实验设计源程序#includestdio.h#includestring.h#includestdlib.hcharprog[80],token[8];charch;intsyn,p,m,n,sum;intkk=0,ii,N,nn=0;intk=0,t,i=0;chartt;char*rwtab[6]={begin,if,then,while,do,end};intscaner();intlrparser();intstatement();intyucu();char*term();char*factor();char*expression();voidemit();struct{charresulted[8];charag1ed[8];charoped[8];charag2ed[8];}quad[20];voidmain(){p=0;printf(……………………………………);printf(\npleaseinputstring:\n);printf(……………………………………\n);printf(\n);printf(……………………………………\n);do{scanf(%c,&ch);prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();printf(……………………………………\n);}char*newtemp(void){char*P;charM[8];P=(char*)malloc(8);k++;itoa(k,M,10);strcpy(P+1,M);P[0]='t';return(P);}intlrparser(){intschain=0;kk=0;if(syn==1){scaner();schain=yucu();if(syn=6){scaner();if(syn==0&&(kk==0))printf(success);}else{if(kk!=1)printf(缺end错误);kk=1;}}else{printf(begin错误);kk=1;}return(schain);}intyucu(){intschain=0;schain=statement();while(syn==26){scaner();schain=statement();}return(schain);}intstatement(){chartt[8],eplace[8];intschain=0;switch(syn){case10:strcpy(tt,token);scaner();if(syn==18){scaner();strcpy(eplace,expression());emit(tt,eplace,,);schain=0;}else{printf(缺少赋值号);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());while(syn==13||syn==14){strcpy(tt,token);scaner();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){strcpy(tt,token);scaner();strcpy(ep2,factor());strcpy(tp,newtemp());emit(tp,eplace,tt,ep2);strcpy(eplace,tp);}return(eplace);}char*factor(void){char*fplace;fplace=(char*)malloc(12);strcpy(fplace,);if(syn==10){strcpy(fplace,token);scaner();}elseif(syn==11){itoa(sum,fplace,10);scaner();}elseif(syn==27){scaner();strcpy(fplace,expression());if(syn==28)scaner();else{printf(')'错误);kk=1;}}else{printf('('错误);kk=1;}return(fplace);}voidemit(char*result,char*ag1,char*op,char*ag2){strcpy(quad[nn].resulted,resul
本文标题:编译原理实验报告3
链接地址:https://www.777doc.com/doc-5324974 .html