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

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-694220.html】到电脑端继续下载(重复下载不扣费)。

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

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(IFELSE条件语句的翻译程序设计递归下降法输出四元式Word下载.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

IFELSE条件语句的翻译程序设计递归下降法输出四元式Word下载.docx

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

2、书收取时间:设计周的次周星期一上午10点。指导教师签名: 2011年 12月 23日系主任(或责任教师)签名: 3、语法分析方法描述及语法分析表设计.4 3.2语法分析表设计.5 4、按给定的题目给出中间代码形式的描述及中间代码序列的结构设计.5 5 、编译系统的概要设计.5 10、附加代码.111、系统描述(问题域描述) 本次实验使用windows XP的visual C+软件,利用递归下降法实现IF-ELSE的条件语句的翻译程序设计,输出四地址表示,程序只能处理简单的布尔表达式和最简单的赋值语句,布尔表达式能够实现大于和小于的识别,也能处理关系运算符=和X then Y else Y; X

3、-id=id; Y-id=id;2.2属性文法的描述: 属性文法(也称属性翻译文法)是Knuth在1968年首先提出的。它是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“特性”(称为属性)。产生式语义规则S-if E then S1 else S2E.true:= biaozhi+;E.fals:= ebiaozhi+;S1.next:=S.next;S2.next:S.code:=E.cod| gen(E.true:)|S1.code| gen(goto S.next)| gen(E.false:)|S2.code3.1语法分析方法描述: 在程序语言的语法定义中

4、有许多采用递归定义。我们在对它进行语法分析时,编制的处理程序也采取递归的方式,可使其结构简单易读。但由于频繁地调用子程序大大地降低了分析速度。 递归下降法的主要思想是:对每个非终结符按其产生式结构写出相应语法分析子程序。因为文法递归相应子程序也递归,子程序的结构与产生式结构几乎一致。所以称此种方法称为递归子程序法或递归下降法。程序是以一个个单词的形式向后读取,读取到if之后就开始执行E的递归子程序,程序根据布尔表达式的真假,进而选择执行相应的分支,即如果布尔表达式为真,就执行then后面的赋值语句,如果布尔表达式为假,就执行else后面的赋值语句,递归子程序E分别赋予布尔表达式真和假不同的地址

5、,并将跳转相应的信息写到处理四元式的结构体数组中去,E执行完以后,回到S中继续执行后面的,读取到then之后,就表示当条件为真的时候,执行then之后的赋值表达式,处理赋值的信息写到处理四元式的结构体数组中去,当读取到else之后,同理的执行当条件为假的时候的赋值表达式,处理完了之后赋值相应的信息也写到处理四元式的结构体数组中去,这样反复执行就实现的对语法的分析。3.2语法分析表设计: 实验要求的是递归下降法,主要是调用不同的递归子程序,所以没有什么语法分析表,流程图在后面。 4.1if-else四元式表示的描述: 中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。三地址

6、代码可看成中间代码的一种抽象形式。 三地址代码通常有三种表示方法:四元式、三元式、间接三元式。我使用三元式输出实验的中间代码。四元式在三元式的基础上增加看result运算结果,四元式之间的联系是通过临时变量实现的。4.2if-else三地址四元式表示序列的就够设计:四元式结构形式: 编号 (OP,ARG1,ARG2,RESULT)If-else变成这种形式形式如下:If ab goto t1goto t2t1:x=a;goto t50t2:x=b;t50:如(jump,-,-,L)写成goto L;把(jrop,B,C,L)写成if B rop C goto L。5 编译系统的概要设计5.1概

7、要分析: 首先在源程序相同的目录下创建一个txt文档,并在文档中输入需要编译的程序即if-else语句,然后定义一个输入流文件,利用这个流文件中的open函数打开我需要编译的txt文件,在调用初始化各种变量的初始化函数。接着开始进行词法分析,词法分析程序的主要任务是对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换成长度统一的标准形式属性字。词法分析是编译过程中的第一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当

8、前单词供语法分析使用。单词的分类(五类):1. 关键字:由程序语言定义的具有固定意义的标识符。也称为保留字或基本字。2. 标识符:用来表示程序中各种名字的字符串。3. 常 数:常数的类型一般有整型、实型、布尔型、文字型。4. 运算符:如+、 、*、/ 等。5. 界限符:如逗号、分号、括号等。但是我做的这个实验没有用到那么多东西,词法分析的有效字符串为: IF,ELSE,THEN, ,.=,=,和从a到z的单个标识符,但是程序还是相对来说比较简单,复杂的表达式可能不能处理,以后会改进。而词法分析的结果就是将相应的单词赋予不同的属性值,利用词法分析表将结果保存起来,为后面的语义分析做准备。词法分析

9、完成之后就是把词法分析的结果都显示出来。语法分析的过程在上面已经有了说明,语法分析完了之后就是打印中间代码的四元式形式,根据上面的结果,四元式的数组里面已经存储了编译的具体信息,之需要按照相应的算符,将他们输出出来,即可看到四元式表示形式。5.2词法分析的具体实现:词法分析的具体过程如下,首先将我们需要的编译的内容读到一个数组之中,利用输入流函数的和获取符号函数配合完成,将数组的的空格、回车等无用的内容去掉,从而将处理过后的转存到该数组中,在利用的这个数组中符号书写的连贯性来进行进行词法分析。例如,then的写法是先写t,再查看下一字符串是否为HEN,那么词法分析一个个单词来进行,发现数组中存

10、储的是t,在判断数组接下来的存储的分别是否为hen,就能够识别关键字then了,其他的是一个道理,处理完成之后就对每个单词的属性都做了出来,就实现了词法分析应该的功能。6 详细的算法描述(流程图或伪代码)6.1词法分析输出部分:void print() for(token_index=0;token_indextotal_len;token_index+) if(tokentabletoken_index.type=$IF) coutIF 关键字endl; if(tokentabletoken_index.type=$ELSE)ELSE if(tokentabletoken_index.typ

11、e=$THEN)THEN if(tokentabletoken_index.type=$ID)tokentabletoken_index.ch if(tokentabletoken_index.type=$LESS) token_index=0;6.2流程图:7 软件的测试方法和测试结果导入文件1.txt,其内容为:IF (ad) THEN x=f; ELSE x=t;ELSE IF (by) THEN x=y; ELSE x=r;词法分析结果为:语法分析结果和四元式显示为:错误的文件:输入:b)THEN ix=a;i=b;#显示:8.研制报告(研制过程,本设计的评价、特点、不足、收获与体会等

12、)本次实验是针对IF-ELSE递归下降输出四元式,没有对复杂的布尔表达式和复杂赋值语句进行处理,基本上满足了实验的基本要求,输出的格式也符合三地址表示的形式,特点是基本实现了嵌套,可以实现对=,等的处理,体现出了递归下降法的思想,递归函数的算法符合题目的要求。 本次实验的不足还有很多,程序只能对单个字母的标识符进行识别,上面的错误例子1就是这样的不足导致的。同时对于复杂的赋值语句也无法进行处理。对于带有运算符的赋值语句,暂时还没有实现,等以后水平提升了以后,应该会进一步完善改算法。 收获:通过本次实验,我收获了很错东西。首先对编译有了进一步的深刻理解,对递归下降法的思想有了很深的认识,同时对于

13、语法分析的原理和过程都有了进一步的巩固,对于C+的编程水平也起到了锻炼的作用,巩固了平时所学的知识,真正做到了学以致用,对于各种结构体的运用也有了深刻的认识。 体会:在做实验的过程中,发现自己在编程序的过程中总是会忽略各种细节,从而导致每次都要改正很错小的低级错误才能正确运行,不仅浪费时间,还会影响到对其他错误地方的修改,此外还缺少较为全面和系统的眼光看待问题,在今后的编程中我会注意改正这方面的缺点,这样才能促使自己编程水平的不断进步。 编译原理是一门非常专业的学科,对于现阶段的我来说,只能掌握它的基本原理,然后在利用C+编程来具体实现,在编译和C+的互相印证中,我不仅对编译原理有了更深的理解

14、,同时也锻炼了自己的动手编程能力,对于将知识转化为能力有了很大的帮助,总之,我学习到了很多的知识。9 参考文献(按公开发表的规范书写)1张素琴、吕映芝、蒋维杜、戴桂兰等编译原理(第2版)清华大学出版社2005年2月参考书:1胡元义等编译原理实践教程西安电子科技大学出版社2002年1月2王雷等编译原理课程设计机械工业出版社2005年3月 3何克右等.C+程序设计教程.武汉理工大学出版社.2005年7月10 附加代码#includefstream.hstring.h#define $ASSIGN 249#define $IF 250#define $THEN 251#define $ELSE 25

15、2#define $GREAT 253#define $LESS 248 #define $ID 254typedef struct Wtoken int type; char ch;Wtoken;typedef enumJUMP,JG,JL,ASSIGN,ENDOpKind;typedef struct int label;/标号 OpKind op; char par1,par2; union char result; int address; ;Fourtable;/四元式#define MAX_TOKEN 256 /Wtoken表大小#define MAX_QUAD 256 /四元式数

16、组大小Wtoken tokentableMAX_TOKEN;Fourtable quadMAX_QUAD;int token_index;/token表索引int total_len;/token表有效长度int quad_len;/四元式表有效长度int quad_index;/四元式索引int label;ifstream ins;bool init(char filename255);bool cifafenxi();void print();void ERROR();void S(int,int);void E(int,int,int);bool nexttoken();int new

17、label();void yufafenxi();void printFourtable();void main() coutfname; if(!init(fname) return;cifafenxi() while(1) if(ins.eof() break; insch;The result of CIFA analyse : print();endl nexttoken();The Grammar: yufafenxi();The FourTable as followings: printFourtable();int newlabel() return label+;bool i

18、nit(char filename255) total_len=0; quad_len=0; quad_index=0; label=100; ins.open(filename,ios:nocreate | ios:in); if(ins.fail() coutbuf; if(strcmp(buf,F)=0) tokentabletotal_len+.type=$IF; else if(ch=THEN tokentabletotal_len+.type=$THEN;ELSE tokentabletotal_len+.type=$ELSE; tokentabletotal_len+.type=

19、$GREAT; tokentabletotal_len+.type=$LESS; tokentabletotal_len+.type=$ASSIGN;x | (cha & ch=total_len) cur.type=tokentabletoken_index.type; cur.ch=tokentabletoken_index.ch; token_index+;void ERROR(char str20)error!strvoid S(int begin,int next) if(cur.type=$ID) char a,b;cur.ch; a=cur.ch; if(!nexttoken() ERROR(S); if(cur.type!=$ASSIGN)=$ID)cur.chE() if(cur.type=$GREAT) coutmark=1; else if(cur.type=$LE

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2