《编译原理》课程设计说明书DOWHILE循环语句的翻译程序设计(LR方法、输出三地址表示)_第1页
《编译原理》课程设计说明书DOWHILE循环语句的翻译程序设计(LR方法、输出三地址表示)_第2页
《编译原理》课程设计说明书DOWHILE循环语句的翻译程序设计(LR方法、输出三地址表示)_第3页
《编译原理》课程设计说明书DOWHILE循环语句的翻译程序设计(LR方法、输出三地址表示)_第4页
《编译原理》课程设计说明书DOWHILE循环语句的翻译程序设计(LR方法、输出三地址表示)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、do-while循环语句的翻译程序设计(lr方法、输出三地址表示)1.系统描述1.1设计目的通过设计、编制、调试一个do-while循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。1.2设计内容及步骤对循环语句: do赋值语句while 表达式按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。(1)按给定的题目给出语法分析方法的思想及分析表设计。(2)按给定的题目给出中间代码序列的结构设计。(3)完成相应的词法分析、语法分析和语义分析程序设计。(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。2文法的描

2、述本程序所用的文法如下:gs:(1)s-doe;while(b)if b.true goto b.true else goto b.false;(2)b-i1 rop i2b.type=bool;b.val=i1.val rop i2.val;(3)e-i1=i2 op i3i1.val=i2.val op i3.val;(4)i-idi.val=id.val;注意:rop is ,op is +,-,*,/, id is any number or identifier由上可知,非终结符b表示布尔表达式,e表示赋值表达式3.语法分析方法描述及语法分析表设计3.1语法分析方法描述本实验采用lr

3、分析方法对do-while语句进行语法分析。lr分析法是一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的k个(k=0)符号就能惟一的确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一的确定句柄。lr分析法的归约过程是规范推导的逆过程,所以lr分析过程是一种规范过程。一个lr分析器由3个部分组成:总控程序,也可以称为驱动程序。对所有的lr分析器,总控程序是相同的。分析表或分析函数。不同的方法分析表将不同,同一个方法采用的lr分析器不同时,分析表也不同,分析表表又可以分为动作(action)表和状态转换(goto)表两个部分,它们都可以用二维数组表示。分析栈,包

4、括文法符号栈和相应的状态栈。它们均是先进后出栈。分析器的动作由栈顶状态和当前输入符号所决定。lr分析器工作过程示意图如图所示:输入串xxx#总控程序action表goto表sn.s1s0xn.x1#sp输出其中sp为栈顶指针,si为状态栈,xi为文法符号栈。状态转换表内容按关系gotosi,x=sj确定,改关系式是指当前栈顶状态为si遇到当前文法符号为x时应转向状态sj。x为终结符或非终结符。actionsi,a规定了栈顶状态为sj时遇到输入符号ci应该执行的动作。动作有以下四种可能:移进:当sj=gotosi,a成立,则把sj移入到文法符号栈。其中i,j表示状态号。规约:当在栈顶形成句柄为b

5、时,则用b归约为相应的非终结符a,即当文法中有a-b的产生式,而b的长度为r,则从状态栈和文法符号栈中自栈顶向下去掉r个符号。并把a移入文法符号栈内,再把满足sj=gotosi,a的状态移进状态栈,其中si为修改指针后的栈顶状态。接受acc:当归约到文法符号栈中只剩下文法的开始符号s时,并且输入符号串已结束即当前输入符是#,则为分析成功。报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该分发能接受的句子。3.2语法分析表设计3.2.1构造文法的dfai0:s-.ss-.doe;while(b)i1:s-s.i2:s-do.e;while(b)i3:s-do.e;

6、while(b) e-.i= i op i i-.idi4:s-doe.;while(b)i5:e-i . =i op ii6:i-id.i7:s-doe;.while(b)i8:e-i=.i op i i-.idi9:s-doe;.while(b)i10:e-i = i. op ii11:s-doe;while.(b)i12:e-i=i op .ii=.idi13:s-doe;while(.b)b-.i rop ii-.idi14:e-i=i op i.i15:s-doe;while(b.)i16:b-i .rop ii17:s-doe;while(b).i18:b-i rop .ii19:

7、b-iropi.i1i0i19i4i13i9i14i15i12i6i10i8i2i7i16i11i5i3i17i183.2.2然后写出lr分析表:状态actiongotodo=;while()ropopid#sbei0s211acc2s33s6454s75s86r4r4r4r4r4r4r4r4r4r4r4r47s98s6109s1110s1211s1312s1413s6151614r3r3r3r3r3r3r3r3r3r3r3r315s1716s1817r1r1r1r1r1r1r1r1r1r1r1r118s61919r2r2r2r2r2r2r2r2r2r2r2r24.中间代码形式的描述及中间代码

8、序列的结构设计4.1中间代码形式的描述在本程序中作用三地址码表示中间代码三地址码的表达形式为:标号结果:=操作数1操作符操作数2常见三地址表示举例:赋值语句 t1 := a op b, a:= b条件转移 if true goto label无条件转移 goto label4.2中间代码序列的结构设计本程序用标号来表示程序的跳转过程,示例如下100 赋值语句101赋值语句102 条件跳转语句103 无条件转移语句5.编译系统的概要设计本编译程序的结构图如下:源程序(do-while 语句)词法分析(lex函数)语法语义分析 (analyze函数)代码生成程序程序输出说明:源程序(do-whil

9、e语句)通过控制台输入。然后通过 lex函数对输入的源程序进行分析后,将分析结果以二元组的方式输出到控制台。接下来通过调用语法语义分析函数来完成对分析得到的单词进行文法句子的识别,并用进行语法制导翻译,完成属性文法定义规定的相关语义动作。本编译程序最后完成的三地址码输出是通过中间文件间接输出到控制台上的。在执行analyze函数的过程中,同时运用ofstream文件流将三地址码输出到一个ascii码的txt类型文件中,最后从该文件中读出最终处理的三地址码输出至控制台。6.详细的算法描述(流程图或伪代码)6.1词法分析词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,根

10、据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。词法分析检查的错误主要是挑出源程序中出现的非法符号。下面为本程序中所用来进行词法分析的伪代码:输入字符;if(字符是字母)查找关键词表;if(是关键字do或者while)识别关键词;else 判断为标识符;else if(字符是数字)获取整个数;else if(运算符)if(是算术运算符)识别算术运算符 ;else 识别为关系运算符;else 标识为其他类型以下附部分源码:int lex(char instr208,int instrlen)/0关键字,1标识符2数字3界符4算符5其他char strsrcbuffursize,strd

11、st8,ch;int strcount=0,strlength,i=0;coutplease input the do-while statement:endl;gets(strsrc);strlength=strlen(strsrc);coutendl lexical analyse:endl;while(strcountstrlength)while(strsrcstrcount= ) strcount+; ch=strsrcstrcount;if(alpha(ch) i=0; do strdsti+=strsrcstrcount+;while(alpha(strsrcstrcount)|

12、digit(strsrcstrcount)&(strcountstrlength); strdsti=0;if(!strcmp(strdst,while)coutsetw(10)(0,strdst)endl;else coutsetw(10)(1,strdst)endl;for(int k=0;strdstk!=0;k+)instrinstrlenk=strdstk;instrinstrlen+k=0; else if(digit(ch)i=0; do strdsti+=strsrcstrcount+;while(digit(strsrcstrcount)&(strcountstrlength

13、); strdsti=0; coutsetw(10)(2,strdst)endl;for(int k=0;strdstk!=0;k+)instrinstrlenk=strdstk;instrinstrlen+k=0; else if(oper(ch)i=0;strdsti=ch;strdsti+1=0;if(!strcmp(strdst,;)|!strcmp(strdst,()|!strcmp(strdst,)|!strcmp(strdst,)|!strcmp(strdst,)coutsetw(10)(3,ch)endl;else coutsetw(10)(4,ch)endl;for(int

14、k=0;strdstk!=0;k+)instrinstrlenk=strdstk;instrinstrlen+k=0;strcount+;elsecoutsetw(10)(5,ch)endl;isillegal=1; coutisillegal=isillegalendl; coutnot while statement endl;break;strcount+;instrinstrlen+0=#;coutinputed stringendl; for(int j=0;jinstrlen;j+)cout instrj;coutgrammer analysisn;return instrlen;

15、6.2语法分析流程图如下,具本处理过程,请参见本文档3.1小节输入串xxx#总控程序action表goto表sn.s1s0xn.x1#sp输出此处附上语法语义分析函数void analyze(state state) int row=0,col=0,numchange=0;cout procedureendl;cout.setf(ios:left);coutstep setw(20)statestacksetw(20)symbolstacksetw(20)inputsetw(8)actionsetw(6)gotoendl;strcpy(next,state.instrstate.curinst

16、r);roporop(next);row=state.stkstatestate.curstate;col=index(next);numchange=tablerowcol;ofstream outfile(do_while.txt);while(strcmp(state.stksymbolstate.cursymbol,s)!=0&numchange!=20)if(numchange=0)isillegal=1;break;numchange=action(state,numchange,outfile);if(isillegal=0)coutsetw(4)step+ ;state.sho

17、wstate();coutsetw(8)accendl;coutprocessing semantic analysis=1&actionnum=18)choice=1;else choice =actionnum;switch(choice)case 0:isillegal=1; coutisillegal=isillegalendl;break;case 1:/移进项目coutsetw(4)step+ ;state.showstate();coutsetw(8)actionnumendl;state.curstate+;state.stkstatestate.curstate=action

18、num; state.cursymbol+; strcpy(state.stksymbolstate.cursymbol,state.instrstate.curinstr);state.curinstr+;strcpy(next,state.instrstate.curinstr);roporop(next);row=state.stkstatestate.curstate;col=index(next);numchange=tablerowcol;break;case 20:/接收coutsetw(4)step+ ;state.showstate();coutsetw(8)accwhile

19、(b)e;coutsetw(4)step+ ;state.showstate();coutsetw(8)0;i-)state.stkstatestate.curstate-=0; for(i=9-1;i=0;i-)strcpy(bi,state.stksymbolstate.cursymbol);strcpy(state.stksymbolstate.cursymbol-,);outfileb.false: iropistrcpy(next,state.stksymbolstate.cursymbol);roporop(next);row=state.stkstatestate.curstat

20、e;col=index(next);numchange=tablerowcol;numchange=goto(state,numchange);break;case 22:/r2 b-iropicnt=0;coutsetw(4)step+ ;state.showstate();coutsetw(8)0;i-)state.stkstatestate.curstate-=0; for(i=3-1;i=0;i-)strcpy(bi,state.stksymbolstate.cursymbol);strcpy(state.stksymbolstate.cursymbol-,);outfile102 t

21、1:=i0b1i1endl;outfile103 if t1.val=true goto 100endl;outfile104 goto 105iropistrcpy(next,state.stksymbolstate.cursymbol);roporop(next);row=state.stkstatestate.curstate;col=index(next);numchange=tablerowcol;numchange=goto(state,numchange);break;case 23:/r3 e-i=iopi cnt=0;coutsetw(4)step+ ;state.shows

22、tate();coutsetw(8)0;i-)state.stkstatestate.curstate-=0; for(i=5-1;i=0;i-)strcpy(ei,state.stksymbolstate.cursymbol);strcpy(state.stksymbolstate.cursymbol-,);outfile100 t1:=i1e3i2endl;outfile101 i0:=t1idcoutsetw(4)step+ ;state.showstate();coutsetw(8)idstrcpy(next,state.stksymbolstate.cursymbol);roporo

23、p(next);row=state.stkstatestate.curstate;col=index(next);numchange=tablerowcol;numchange=goto(state,numchange);break;return numchange;int goto(state &state,int gotonum) int row=0,col=0,numchange=0;coutsetw(6)gotonumendl;state.curstate+;state.stkstatestate.curstate=gotonum;strcpy(next,state.instrstat

24、e.curinstr);roporop(next);row=state.stkstatestate.curstate;col=index(next);return tablerowcol;7.软件的测试方法和测试结果(1)运行程序,显示如下程序界面(2)按照提示输入合法的do-while语句doa=b+c;while(ab)(3)按enter确定输入完毕,得到词法分析结果,显示如下:并且最后一行提示了经过词法分析后合法的待输入串在栈中的存储情况。(4)继续确定,可以看见输入的句子的按lr方法的详细处理过程。结果显示如下:由此可以看见在用lr方法识别d0-while句子的时候,状态栈,符号栈以及

25、待输入串的详细变化情况。(说明, 其中21,22,23,24分别表示用第1、2、3、4个产生式进行归约。)(5)继续执行程序,最终出现语义分析结果8.研制报告8.1研制过程本次实验是对do-while语句运用lr分析法进行语法分析,分析的过程中要求运用属性文法和语法制导翻译的相关知识来有效完成对一个合法的do-while语的语义分析。做实验如果有一个比较详细的安排和计划,就会使实验进程井井有条。在实验之始,按照实验说明书的要求,对实验进行了模块划分。首先大致分为三个部分,包括词法分析,语法分析和语义分析。因为以前做过词法分析和语法分析的相关实验,所以这部分比较容易。于是精力大部分放在第三个部分语义分析上。首先,根据自己拟定文法,构造出正确的lr分析表,文法虽然只有四个产生式,但经过分析,却产生了多达20个状态。完成了lr分析,接着是确定给定文法的属性文法,以便在语

温馨提示

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

评论

0/150

提交评论