编译原理上机报告.doc_第1页
编译原理上机报告.doc_第2页
编译原理上机报告.doc_第3页
编译原理上机报告.doc_第4页
编译原理上机报告.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、实验题目:语义分析二、实验目的通过上机实习巩固上课所学的语义分析方面的知识。通过理论与实践结合的过程强化编程能力。通过从词法分析-语法分析-语义分析(生成三地址码)的过程,进一步体会编译的原理。加深对语法制导翻译原理的理解,掌握将语法分析说识别的语法成分变换为中间代码的语义翻译方法。三、实验要求采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成是元式序列。文法结构定义如下:程序=main()语句块.语句块= 语句串语句串 =语句;语句;语句 =赋值语句赋值语句 ID表达式表达式 =项+项|-项项=因子*因子|/因子因子=ID|NUM|(表达式)关系运算符 =|=|=|!=试验的输入和输出:输入是语法分析后提供的正确的单词串,输出为三地址指令形式的四元式序列。例如:对于语句串 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)设置语义过程 emit(char *result,char *ag1,char *op,char *ag2)该函数的功能是生成一个三地址语句送到四元式表中。四元式表的结构如下:structchar *result;char *ag1;char *op;char *ag2;quad20; char *newtemp()该函数回送一个新的临时变量名,临时变量名产生的顺序为体T1,T2,.。char *newtemp()char *p;char m8;p=(char *)malloc(8);k+;itoa(k,m,10);strcpy(p+1,m);p0=t;return(p);四、试验流程图置初值调用scaner调用lrparser输出四元组结 束五实验代码#include stdafx.h#include #include #include structchar *result;char *ag1;char *op;char *ag2;quad20;char prog80;char token8;char ch;int syn,p,m,n,sum,kk,k;char * rwtab6=begin,if,then,while,do,end;void scaner();int lrparser();int yucu();int statement();char * term();char * expression();char * factor();void emit(char* ,char* ,char* ,char* );char *newtemp()char *p;char m8;p=(char *)malloc(8);k+;itoa(k,m,10);strcpy(p+1,m);p0=t;return(p);void emit(char *result,char *ag1,char *op,char *ag2)int i;i=0;while(quadi.result!=NULL)i+;quadi.result=result;quadi.ag1=ag1;quadi.op=op;quadi.ag2=ag2;printf(%s=%s%s%sn,quadi.result,quadi.ag1,quadi.op,quadi.ag2);int main()p=0;printf( please input string:n);doch=getchar();progp+=ch;while(ch!=#);p=0;doscaner();lrparser();switch(syn) case 11:printf(%d%n,syn);break;case -1:printf(you have input a wrong stringn);break;default:printf(%d%n,syn);while(syn!=0);return(0);void scaner() int m=0;for(n=0;n=65 & ch=97 & ch=65 & ch=97 & ch=48 & ch=57) tokenm+=ch;ch=progp+;tokenm+=0;ch=progp-;syn=10;for(n=0;n=48 & ch=48 & ch=57) sum=sum*10+(ch-48);ch=progp+;ch=progp-;syn=11;elseswitch(ch) case)syn=21;tokenm+=ch;else if(ch=)syn=22;tokenm+=ch;elsesyn=20;ch=progp-;break;case:tokenm+=ch;ch=progp+;if(ch=)syn=24;tokenm+=ch;elsesyn=23; ch=progp+;break;case: tokenm+=ch;ch=progp+;if(ch=)syn=18;tokenm+=ch;elsesyn=17;ch=progp-;break;case+: syn=13;token0=ch;break;case-: syn=14;token0=ch;break;case*: syn=15;token0=ch;break;case/: syn=16;token0=ch;break;case=: syn=25;token0=ch;break;case;: syn=26;token0=ch;break;case(: syn=27;token0=ch;break;case): syn=28;token0=ch;break;case#: syn=0;token0=ch;break;default: syn=-1;int lrparser()int schain=0;kk=0;if(syn=1)scaner();schain=yucu();if(syn=6)scaner();if(syn=0 & (kk=0)printf(successn);else if(kk!=1)printf(end you cuo!n);kk=1;else printf(begin errorn);kk=1; return(schain);int yucu()int schain=0;schain=statement();while(syn=26) scaner();schain=statement();return(schain);int statement() char tt10,eplace10;int schain=0;switch(syn) case 10:strcpy(tt,token);scaner();if(syn=18) scaner();strcpy(eplace,expression();emit(tt,eplace,);schain=0; else printf(lack=:);kk=1;return(schain); char *expression()char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(10);ep2=(char *)malloc(10);eplace=(char *)malloc(10);tt=(char *)malloc(10);strcpy(eplace,term();while(syn=13|syn=14)if(syn=13)tt=+;elsett=-;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(10);ep2=(char *)malloc(10);eplace=(char *)malloc(10);tt=(char *)malloc(10);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;char *expression();fplace=(char *)malloc(10);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);kk=1; else printf(error); kk=1; return(fplace);六、心得体会:说到本次实验,在此之前,对于编译我们的理解程度是知道词法分析,语法分析,语义分析三者之间的关系,从宏观上大概了解一个编译器的工作过程和工作原理。每堂课都认真听讲,对于所讲的内容基本都能明白。然而,当真正面对实验时,我们真正才感到我们只是明白其大概的工作原理,而具体实现上几乎没有什么思路。正因如此,我们更加下定决心要把实验做好,要借这个机会把这个学期所学的东西真正掌握。在把书上相关内容仔细看过几遍后,我们慢慢开始回想起了课堂上的东西,并慢慢把他们联系到了一起。词法分析程序相对容易一些,书上相关的知识也不是太多,我们觉得主要是把状态转换图设计好,剩下的就是编程实现的问题了。因此我们在设计它时花了很多的时间,从健壮性方面考虑,我们在程序中尽可能的考虑了可能出现的异常情况,并设计了能够定位错误位置,进行续编译的出错处理程序。现在回想起来,如果不是词法分析中的出错处理程序相对完善,在语法、语义分析程序中的出错处理程序将更难实现。在语法、语义程序中的输入方式不在需要单独考虑,具体的实现已经完全被封装到了词法分析对象中。实验中我们真正体会到了书本上的理论知识与具体程序实现相联系的灵活性,尤其是在实验二中,体会更为深刻。实验二/三中,书上所学的知识发挥了很大的作用,对于同一个实验任务,书上面提到了不同的实现方法,此外同学们还可以利用课外的知识来完成,可以说没有一个定式。而针对不同的方法,在具体实践中会遇到不同的问题,比如我们是利用LL1自顶向下的分析方法来做的,并且使用的是递归子程序的方法,在实验

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论