欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年编译DO-WHILE循环语句的翻译程序设计 .pdf

    • 资源ID:39689330       资源大小:311.04KB        全文页数:16页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年编译DO-WHILE循环语句的翻译程序设计 .pdf

    *理工大学编译原理课程设计说明书第 1 页 共 16 页DO-WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)1.系统描述1.1 设计目的通过设计、编制、调试一个DO-WHILE 循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。1.2 设计内容及步骤对循环语句:DO赋值语句 WHILE 表达式按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。(1)按给定的题目给出语法分析方法的思想及分析表设计。(2)按给定的题目给出中间代码序列的结构设计。(3)完成相应的词法分析、语法分析和语义分析程序设计。(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。2 文法的描述本程序所用的文法如下:GS:(1)S-doE;while(B)if B.true goto B.true else goto B.false;(2)B-I1 rop I2 B.type=bool;B.val=I1.val rop I2.val;(3)E-I1=I2 op I3 I1.val=I2.val op I3.val;(4)I-id I.val=id.val;注意:rop is,op is+,-,*,/,id is any number or identifier 由上可知,非终结符B 表示布尔表达式,E 表示赋值表达式3.语法分析方法描述及语法分析表设计3.1 语法分析方法描述本实验采用 LR 分析方法对 DO-WHILE 语句进行语法分析。LR 分析法是一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K 个(K=0)符号就能惟一的确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一的确定句柄。LR 分析法的归约过程是规范推导的逆过程,所以 LR 分析过程是一种规范过程。一个 LR 分析器由 3 个部分组成:总控程序,也可以称为驱动程序。对所有的LR 分析器,总控程序是相同的。分析表或分析函数。不同的方法分析表将不同,同一个方法采用的LR分析器不同时,分析表也不同,分析表表又可以分为动作(ACTION)表和状态转换(GOTO)表两个部分,它们都可以用二维数组表示。分析栈,包括文法符号栈和相应的状态栈。它们均是先进后出栈。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 16 页 -*理工大学编译原理课程设计说明书第 2 页 共 16 页分析器的动作由栈顶状态和当前输入符号所决定。LR 分析器工作过程示意图如图所示:其中 SP为栈顶指针,Si为状态栈,Xi 为文法符号栈。状态转换表内容按关系GOTOSi,X=Sj 确定,改关系式是指当前栈顶状态为Si 遇到当前文法符号为X时应转向状态 Sj。X 为终结符或非终结符。ACTIONSi,a 规定了栈顶状态为Sj 时遇到输入符号 ci 应该执行的动作。动作有以下四种可能:移进:当 Sj=GOTOSi,a成立,则把 Sj 移入到文法符号栈。其中i,j 表示状态号。规约:当在栈顶形成句柄为b 时,则用 b 归约为相应的非终结符A,即当文法中有 A-b 的产生式,而b 的长度为 r,则从状态栈和文法符号栈中自栈顶向下去掉 r 个符号。并把 A 移入文法符号栈内,再把满足Sj=GOTOSi,A的状态移进状态栈,其中 Si 为修改指针后的栈顶状态。接受 acc:当归约到文法符号栈中只剩下文法的开始符号S 时,并且输入符号串已结束即当前输入符是#,则为分析成功。报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该分发能接受的句子。3.2 语法分析表设计3.2.1 构造文法的 DFA I0:S-.S S-.doE;while(B)I1:S-S.I2:S-do.E;while(B)I3:S-do.E;while(B)E-.I=I op I I-.id 输入串 XXX#总控程序ACTION 表GOTO 表Sn.S1 S0 Xn.X1#SP 输出名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 16 页 -*理工大学编译原理课程设计说明书第 3 页 共 16 页I4:S-doE.;while(B)I5:E-I.=I op I I6:I-id.I7:S-doE;.while(B)I8:E-I=.I op I I-.id I9:S-doE;.while(B)I10:E-I=I.op I I11:S-doE;while.(B)I12:E-I=I op.I I=.id I13:S-doE;while(.B)B-.I rop I I-.id I14:E-I=I op I.I15:S-doE;while(B.)I16:B-I.rop I I17:S-doE;while(B).I18:B-I rop.I I19:B-IropI.3.2.2 然后写出 LR分析表:状态ACTION GOTO Do =;While()Rop Op Id#S B E I 0 S2 1 1 acc 2 S3 I1 I0 I19 I4 I13 I9 I14 I15 I12 I6 I10 I8 I2 I7 I16 I11 I5 I3 I17 I18 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 16 页 -*理工大学编译原理课程设计说明书第 4 页 共 16 页3 S6 4 5 4 S7 5 S8 6 R4 R4 R4 R4 R4 R4 R4 R4 R4 R4 R4 R4 7 S9 8 S6 10 9 S11 10 S12 11 S13 12 S14 13 S6 15 16 14 R3 R3 R3 R3 R3 R3 R3 R3 R3 R3 R3 R3 15 S17 16 S18 17 R1 R1 R1 R1 R1 R1 R1 R1 R1 R1 R1 R1 18 S6 19 19 R2 R2 R2 R2 R2 R2 R2 R2 R2 R2 R2 R2 4.中间代码形式的描述及中间代码序列的结构设计4.1 中间代码形式的描述在本程序中作用三地址码表示中间代码三地址码的表达形式为:标号结果:=操作数 1 操作符操作数 2 常见三地址表示举例:赋值语句t1:=a op b,a:=b 条件转移if true goto Label 无条件转移goto Label 4.2 中间代码序列的结构设计本程序用标号来表示程序的跳转过程,示例如下100 赋值语句101 赋值语句102 条件跳转语句103 无条件转移语句名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 16 页 -*理工大学编译原理课程设计说明书第 5 页 共 16 页5.编译系统的概要设计本编译程序的结构图如下:说明:源程序(do-while 语句)通过控制台输入。然后通过Lex 函数对输入的源程序进行分析后,将分析结果以二元组的方式输出到控制台。接下来通过调用语法语义分析函数来完成对分析得到的单词进行文法句子的识别,并用进行语法制导翻译,完成属性文法定义规定的相关语义动作。本编译程序最后完成的三地址码输出是通过中间文件间接输出到控制台上的。在执行 Analyze函数的过程中,同时运用 ofstream文件流将三地址码输出到一个ASCII 码的 txt 类型文件中,最后从该文件中读出最终处理的三地址码输出至控制台。6.详细的算法描述(流程图或伪代码)6.1 词法分析词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。词法分析检查的错误主要是挑出源程序中出现的非法符号。下面为本程序中所用来进行词法分析的伪代码:输入字符;If(字符是字母)查找关键词表;If(是关键字 do 或者 while)识别关键词;源程序(do-while 语句)词法分析(Lex 函数)语法语义分析(Analyze 函数)代码生成程序程序输出名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 16 页 -*理工大学编译原理课程设计说明书第 6 页 共 16 页Else 判断为标识符;Else if(字符是数字)获取整个数;Else if(运算符)If(是算术运算符)识别算术运算符;Else 识别为关系运算符;Else 标识为其他类型以下附部分源码:int Lex(char InStr208,int InStrLen)/0 关键字,1 标识符 2 数字 3 界符 4 算符 5 其他char strsrcBUFFURSIZE,strdst8,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+;名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 16 页 -*理工大学编译原理课程设计说明书第 7 页 共 16 页while(Alpha(strsrcstrcount)|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);strdsti=0;coutsetw(10)(2,strdst)endl;for(int k=0;strdstk!=0;k+)InStrInStrLenk=strdstk;InStrInStrLen+k=0;名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 16 页 -*理工大学编译原理课程设计说明书第 8 页 共 16 页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 k=0;strdstk!=0;k+)InStrInStrLenk=strdstk;InStrInStrLen+k=0;strcount+;else coutsetw(10)(5,ch)endl;isillegal=1;coutisillegal=isillegalendl;coutnot while statement endl;break;strcount+;InStrInStrLen+0=#;coutinputed stringendl;for(int j=0;jInStrLen;j+)名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 16 页 -*理工大学编译原理课程设计说明书第 9 页 共 16 页cout InStrj;coutgrammer analysisn;return InStrLen;6.2 语法分析流程图如下,具本处理过程,请参见本文档3.1 小节此处附上语法语义分析函数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.CurInstr);ropOrOp(next);row=state.stkStatestate.CurState;col=Index(next);numchange=tablerowcol;输入串 XXX#总控程序ACTION 表GOTO 表Sn.S1 S0 Xn.X1#SP 输出名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 16 页 -*理工大学编译原理课程设计说明书第 10 页 共 16 页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.showState();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=actionnum;state.CurSymbol+;strcpy(state.stkSymbolstate.CurSymbol,state.InStrstate.CurInstr);名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 16 页 -*理工大学编译原理课程设计说明书第 11 页 共 16 页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(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:IropI strcpy(next,state.stkSymbolstate.CurSymbol);ropOrOp(next);row=state.stkStatestate.CurState;col=Index(next);numchange=tablerowcol;numchange=Goto(state,numchange);break;case 22:/r2 B-IropI cnt=0;coutsetw(4)step+;名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 16 页 -*理工大学编译原理课程设计说明书第 12 页 共 16 页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 t1:=I0B1I1endl;outfile103 if t1.val=true goto 100endl;outfile104 goto 105IropI strcpy(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.showState();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:=t1id coutsetw(4)step+;state.showState();coutsetw(8)id strcpy(next,state.stkSymbolstate.CurSymbol);ropOrOp(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.InStrstate.CurInstr);ropOrOp(next);row=state.stkStatestate.CurState;col=Index(next);return tablerowcol;7.软件的测试方法和测试结果(1)运行程序,显示如下程序界面名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 16 页 -*理工大学编译原理课程设计说明书第 14 页 共 16 页(2)按照提示输入合法的do-while 语句Doa=b+c;while(ab)(3)按 enter确定输入完毕,得到词法分析结果,显示如下:并且最后一行提示了经过词法分析后合法的待输入串在栈中的存储情况。(4)继续确定,可以看见输入的句子的按LR 方法的详细处理过程。结果显示如下:名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 16 页 -*理工大学编译原理课程设计说明书第 15 页 共 16 页由此可以看见在用LR 方法识别 d0-while 句子的时候,状态栈,符号栈以及待输入串的详细变化情况。(说明,其中 21,22,23,24 分别表示用第1、2、3、4个产生式进行归约。)(5)继续执行程序,最终出现语义分析结果8.研制报告8.1 研制过程本次实验是对 do-while 语句运用 LR 分析法进行语法分析,分析的过程中要求运用属性文法和语法制导翻译的相关知识来有效完成对一个合法的do-while语的语义分析。做实验如果有一个比较详细的安排和计划,就会使实验进程井井有条。在实验之始,按照实验说明书的要求,对实验进行了模块划分。首先大致分为三个部分,包括词法分析,语法分析和语义分析。因为以前做过词法分析和语法分析的相关实验,所以这部分比较容易。于是精力大部分放在第三个部分语义分析上。首先,根据自己拟定文法,构造出正确的LR 分析表,文法虽然只有四个产生式,但经过分析,却产生了多达20 个状态。完成了LR 分析,接着是确定给定文法的属性文法,以便在语法制导翻译中,根据所给的语义动作,有效完成三地址码的输出。确定了程序的基本结构和流程,接下来就是编制程序了。模块化的功能函数降低了编制程序的难度,经过不断修改和调试程序,终于成功完成了该实验。名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 16 页 -*理工大学编译原理课程设计说明书第 16 页 共 16 页8.2 设计评价本次实验设计能有效识别合法的do-while 语句。根据给定的文法,只要是形如 doE;while(B)的句子(其中 E 为赋值表达式,B 为布尔表达式),都可以正确得出其 LR 分析的详细过程,并且做出有效的三地址输出。在本次实验中,对于数据结构有特殊的要求,需要用到具有先进后出性质的栈结构,但是为了方便本次实验的处理,采用一维数组来模拟栈结构。同时,将状态栈,符号栈,和待输入串放在一个类中,以便可以声明对象直接进行处理。虽然本次实验成功完成了对do-while 语句的语法制导翻译过程,但是还是存在一些缺点。比如,在词法分析过程中,没有对错误的语句输入进行判断,因此只有输入正确的do-while 语句,才能完成程序执行。8.3 心得与体会通过这次为期一周的实验,完成了对 do-while 语句的翻译过程。这次实验对这半年来所学习的编译原理的相关知识进行了有效应用,尤其是对比较抽象的词法分析,语法分析,语义分析,语法制导翻译等有了更深层次的理解。正因为理论联系实践,我才对编译原理这门课程有了更好的掌握。虽然实验成功了很有成就感,但也发现了自己的一些不足。比如对一些基础知识的理解还不够透彻,对所学的算法还不能够熟练应用。不管这次实验中有多少跌跌撞撞,但终归是受益匪浅。学习就是不断进步的过程,经过这次的课程设计,我的编程能力和逻辑分析能力得到了锻炼。9.参考文献1张素琴、吕映芝、蒋维杜、戴桂兰等编译原理(第二版)清华大学出版社2005年 2月参考书:1何炎祥编译原理(第二版)华中科技大学出版社 2005 年 8 月2胡伦骏编译原理(第2 版)电子工业出版社 2005 年 2 月3胡元义等编译原理实践教程西安电子科技大学出版社2002 年 1 月4钱能著,C程序设计教程,北京:清华大学出版社,2002.7 名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 16 页 -

    注意事项

    本文(2022年编译DO-WHILE循环语句的翻译程序设计 .pdf)为本站会员(H****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开