ImageVerifierCode 换一换
格式:DOC , 页数:16 ,大小:291.51KB ,
资源ID:4851389      下载积分:8 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4851389.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示).doc)为本站上传会员【丰****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示).doc

1、 学 号: 0120810340605 课 程 设 计 题 目 IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 学 院 计算机科学与技术学院 专 业 计算机科学与技术 班 级 0806 姓 名 周雪 指导教师 郭羽成 2010 年 1 月 6 日 课程设计任务书 学生姓名: 周 雪 专业班级: 计算机0806班 指导教师: 郭 羽 成 工作单位:计算机科学与技术学院 题目: IF-ELSE条件语句的翻译程序设计

2、LL(1)法、输出三地址表示) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1) 写出符合给定的语法分析方法的文法及属性文法。 (2) 完成题目要求的中间代码三地址表示的描述。 (3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:

3、 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取

4、时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 11月 23日 系主任(或责任教师)签名: 2010年 11月 23日 1 问题描述 要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。 2 问题分析及编译系统的概要设计 编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一

5、个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。 这次实验涉及到词法分析、语法分析、语义分析及表格管理和出错管理。其中,词法分析至少要能识别关键字“if”、“then”和“else”,标识符(即自定义变量),数字,和运算符等等;语法分析要分析程序结构的合法性,即是否为文法的句子;语义分析要能够语法制导翻译出中间代码(三地址)并将其输出;表格管理是指符号表;出错处理是指在语法分析时,所有非文法句子的错误类型处理. 3 文法及属性文法的定义 3.1 文法: 文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能

6、力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序. IF-ELSE条件语句的文法如下所示: 0.A->EB 1.B->+EB|-EB|ε 2.E->FT 3.T->*FT|/FT|ε 4.F->i|(E) 或者能够更简洁一点: 0.S->if A THEN B ELSE C 1.A->m rop n 2.B->x=

7、m arop n 3.C->x=n arop m 4.rop->=|<|> 5.arop->+|-|*|/ 3.2 属性文法: 属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。 在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规则的形式为:b:=f(c1,c2,…,ck)其中f是一个函数,而且或者①b是A的一个综合属性并且c1,c2,…,ck是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有

8、继属性,文法开始符号的所有继承属性作为属性计算前的初始值。 属性文法为: 0.S->if A THEN B ELSE C { S.chain:=merge(A.chain,B.chain, C.chain)} 1.A->m rop n { A.true:=nextstat; A.false=nextstat+1; backpatch(A.chain,nextstat); emit(“if p” rop “q goto —”) emit(

9、goto —”) ; } 2.B->x=m arop n { backpatch(B.chain,nextstat); emit(“ x:= m” arop “n”); emit(“goto —”); } 3.C->x=n arop m { backpatch(C.chain,nextstat); emit(“ x:= n” arop “m”); emit(“goto —”); } 4.rop -> = { emit(“ = ”); }

10、 5. rop -> <{ emit(“ < ”); } 6. rop -> >{ emit(“ > ”); } 7. arop -> +{ emit(“ + ”); } 8. arop-> - { emit(“ - ”); } 9.arop-> *{ emit(“ * ”); } 10.arop-> /{ emit(“ / ”); } 4 词法分析 首先应该创建一个枚举类型的变量来存放一些关键字,enum ke

11、yword{$right_paren,$left_paren,$mul,$div,$add,$sub,$fenhao,$equal,$IF,$THEN,$ELSE,$greater,$less,$id,$num,$end}; 再创建一个结构体,用来存放词法分析的结果,共有两个域,一个关键字域,表明他是什么类型,以及它自身的内容。 这个词法分析程序比较简单,因为本身的程序就局限在if-else语句,所以保留字的类型我就只写了if、then和else三个;碰到数字开头的除了关键字就是标识符;碰到数字开头的就是数字;碰到界限符和操作符(因为引入的类型也很少),所以也很容易

12、区别。 在词法分析结束之后,就应该把分析的结果输出来。输出的格式是【(单词,类型编号) 类型名】 源程序文件 字符的分离 单词的判断 查找相应的表 单词的类型的判断 调用不同类型的单词处理函数进行单词的处理 产生类型码 将中间单词和其类型码存入数组 处理完毕 词法分析程序如下: bool lexcal() { int k

13、0; char buf[16]; char ch; while(1) { ins>>ch; if(ins.fail()) break; while(ch==' ') { ins>>ch;} if(ch=='I') { ins>>buf; if(s

14、trcmp(buf,"F")==0) tokentable[total_len++].type=$IF; } else if(ch=='T') { ins>>buf; if(strcmp(buf,"HEN")==0) tokentable[total_len++].type=$THEN; } else if(ch=='E')

15、 { ins>>buf; if(strcmp(buf,"LSE")==0) tokentable[total_len++].type=$ELSE; } else if(ch=='>') { tokentable[total_len++].type=$greater; }

16、 else if(ch=='<') { tokentable[total_len++].type=$less; } else if(ch=='=') { tokentable[total_len++].type=$equal; } else if((ch>='A'&& ch<='Z' )|| (

17、ch>='a' && ch<='z')) { tokentable[total_len].type=$id; tokentable[total_len++].ch=ch; } else if(ch>='0' && ch<='9') { tokentable[total_len].type=$num; tokentable[total

18、len++].ch =ch; } else switch (ch) { case '+' : tokentable[total_len].type=$add; tokentable[total_len++].ch =ch; break; case '-' : tokentable[total_len].type=$sub;

19、 tokentable[total_len++].ch =ch; break; case '/' : tokentable[total_len].type=$div; tokentable[total_len++].ch =ch; break; case '*' : tokentable[total_len].type=$mul;

20、 tokentable[total_len++].ch =ch; break; case ';' : tokentable[total_len].type=$fenhao; tokentable[total_len++].ch =ch; break; case '(' : tokentable[total_len].type=$left_paren; tokent

21、able[total_len++].ch =ch; break; case ')' : tokentable[total_len].type=$right_paren; tokentable[total_len++].ch =ch; break; default:cout<<"!"<

22、要的思想是设置一个分析栈和一个输入串队列,栈中最开始时存放的是文法开始 符和“#”。因为我这个程序本身已经确定是以if语句开头,所以,就不再把if放在 输入串中,而只是分析if以后的句子。在语法分析之前应该判定该文法是不是一个 LL(1)文法。判别的主要方法是做出文法中所有产生式的select集,对于同一个非终 结符的不同产生式,如果他们的select集合没有交集,则说明这个文法是LL(1)文法。 这个文法的预测分析表也设计的比较简单,如下表所示: i + - * / ( ) # E 1 0 0 0 0

23、 1 0 0 A 0 1 1 0 0 0 1 1 T 1 0 0 0 0 1 0 0 B 0 1 1 1 1 0 1 1 F 1 0 0 0 0 1 0 0 注:1代表此处有产生式与之对应,具体的产生式在程序中给出。0代表此处无产生式与之对应。 void syntax() { count++; print(); X=stack[sp]; a=que

24、ue[front]; if(X=='#'&&a=='#')f=4; if(X<'A'||X>'Z'){ if(X==a){ sp--; front++; if(a!='i'){ if(a!='d'&&a!='w'&&a!=';'&&a!='#'){opr=index(a,VT);semantic();} else if(a==';'||a=='w'||a=='#'){opr=-2;semantic();} cout<<'\t'<<'\''<

25、"<"; if(len(p[n])!=0){ for(i=len(p[n])-1;i>=0;i--){ stack[++sp]=p

26、[n][i];cout<

27、义分析及中间代码输出 根据上面给出的属性文法所规定的翻译方案,即可对输入的程序进行相应的语义分析。对于中间代码部分,老师给的题目是以三地址的形式输出。对于三地址形式,在学习编译原理的时候接触的不是很多。我们接触的多的一般都是逆波兰式和四元式。仔细看书才发现,三地址和四元式是很相近的。比如说计算一个表达式a+b-c,四元式的形式是(+,a,b,t1),(-,t1,c,t2)。而三地址的形式为t1:=a+b,t2=t1-c。而对于跳转语句,无条件跳转如jump L1的四元式形式为(jump,-,-,L1);而其对应的三地址形式为goto L1。而对于条件跳转语句,则四元式为(jrop,a

28、b,L1),而三地址形式为if a rop b goto L1。 产生跳转的主要有三个地方,第一,就是if条件成立,则跳转到then后面的语局;第二,执行完then后面的语句后跳转到程序的出口;第三,就是if条件不成立则跳转到else后面的语句。在判断完if后面的条件后,保存这个布尔值,并产生跳转地址,这时,应该继续向前读取,如果碰到then这个关键字,则回填地址到then前面,否则报错。 关键是回填地址的那个函数一定要写准确。在有跳转的语句后面,一定要有跳转的地址,即要跳到什么地方。产生跳转的语句有在token这个结构体中有个地址域,用来保存转向的地址。而在产生运算结果的语句中,to

29、ken这个结构体中有个result域,用来保存这个结果。 //产生数值语句 void AD_RESULT(int nlabel,OpKind nop,char npar1,char npar2, char nresult) {quad[quad_len].label=nlabel; quad[quad_len].op=nop; quad[quad_len].par1=npar1; quad[quad_len].par2=npar2; quad[quad_len].result=nresult; quad_len++; } //产生跳转地址 void A

30、D_ADDRESS(int nlabel,OpKind nop,char npar1,char npar2,int naddress) { quad[quad_len].label=nlabel; quad[quad_len].op=nop; quad[quad_len].par1=npar1; quad[quad_len].par2=npar2; quad[quad_len].address=naddress; quad_len++; } //回填出口 void backpath(int nlabel,int addr) { quad[nlabel]

31、address=addr; } 而三元式的输出则很简单。但也要根据它具体的语义来进行输出。如果是if语句,则要根据if后面的bool语句来实现跳转。如果为真,应该调到then后面的语句,如果为假,则跳转到else后面的语句,每个语句都有自己的标号,用label来标识。而对于每个计算结果的表达式,则首先用一个中间变量来存放结果,每次按照运算符的优先级算出一个结果,保存在中间变量中,最后将中间变量的结果赋给语句中的变量。 7 软件测试方法和结果 输入一组正确的词法和语法的if-else语句,和一组有词法错误和语法错误的if语句。 1. IF

32、m

33、的输出程序。词法分析程序由于上次实验做过了,所以这次做起来还是比较的顺手,只是这次的单词设计的比较简单,如关键字就只有三个,if、else和then;用户自定义变量的标识符也没有考虑以下划线开头的部分。 我做的语法分析方法是ll(1)的分析方法,这个方法的关键首先要构造一个if else语句的文法,然后将其转换为ll(1)文法,再根据每个产生式的select集构造预测分析表。然后就是相应的分析。构造一个分析栈和一个输入串队列,栈的初始内容是文法的开始符号和“#”,输入串队列则是输入串的内容。然后根据预测分析表做出相应的推导和匹配动作,最后如果栈里的内容和队列里的内容都是以“#”号的

34、形式匹配的话,这个语句就分析成功。我这次主要只是考虑了表达式的分析过程,而没有把if else then这些关键字的分析过程加入进来。因为我们这次设计也是针对一个特定的语句(如我的if else语句)来进行分析的,所以我就假设所有的输入串当中都在相应的位置有那些关键字了。所以程序做起来就比较简单,容易实现。 而语义分析则是要识别这句话要做什么,并且将其要做的事情用三地址的形式翻译出来。这个对我来说的确有点困难,所以见参考了一下其他同学的设计方法。这个也是这次设计的不足之处,望老师见谅----。 9 参考文献 1. 张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第2版).清华大

35、学出版社.2005年2月参考书: 2. 《程序设计语言编译原理》 国防工业出版社 陈火旺著 3. 《编译原理习题与解析》 清华大学出版社出版社 伍春香著 本科生课程设计成绩评定表 班级:   0806   姓名:周雪   学号:0120810340605 序号 评分项目 满分 实得分 1 学习态度认真、遵守纪律 10 2 设计分析合理性 10 3 设计方案正确性、可行性、创造性 20 4 设计结果正确性 40 5 设计报告的规范性 10 6 设计验收 10 总得分/等级 评语: 注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、 及格(60-69分)、60分以下为不及格      

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服