




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、武汉理工 课程设计说明书学 号:0121课程设计课程名称编译原理课程设计题目IF-ELSE 条件语句的翻译程序设计(递 归下降法、输出四元式)学院计算机科学与技术专业计算机科学与技术班级计算机 1001 班姓名指导教师陈天煌2013年 1 月 7 日武汉理工 课程设计说明书课程设计任务书学生姓名 专业班级: 计算机 1001 班指导教师: 陈天煌 工作单位:计算机科学与技术学院 题目: IF-ELSE 条件语句的翻译程序设计(递归下降法、 输出四元式表 示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进 行设计
2、。要求完成的主要任务 : (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。(2)完成题目要求的中间代码四元式的描述。(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。(5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:系统描述(问题域描述) ;文法及属性文法的描述;语法分析方法描述及语法分析表设计;按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;编译系统的概要设计;详细的算法描述(流程图或伪代码) ;软件的测试方法和测试
3、结果;研制报告(研制过程,本设计的评价、特点、不足、收获与体会等) ;参考文献(按公开发表的规范书写) 。时间安排:设计安排一周:周 1、周 2:完成系统分析及设计。周 3 、周 4 :完成程序调试及测试。 周 5 :撰写课程设计报告。设计验收安排:设计周的星期五第 1 节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午 10 点。年月日指导教师签名:武汉理工 课程设计说明书IF-ELSE 条件语句的翻译程序设计(递归下降法、输出四元式)1. 系统描述(问题域描述)本次实验使用 windows XP 的 visual C+ 软件,利用递归下降法实现 IF-ELSE 的条
4、 件语句的翻译程序设计,输出四元式表示,程序只能处理简单的布尔表达式和最简单的 赋值语句,布尔表达式能够实现大于和小于的识别,也能处理关系运算符 =和X then Y else Y;X-ididid;X-idid=id;Y-id=id ;2.3 属性文法的描述:属性文法(也称属性翻译文法 )是 Knuth在 1968年首先提出的。它是在上下文无关文法的基础上, 为每个文法符号 ( 终结符或非终结符 ) 配备若干相关 的“特性”(称为属性)。语法分析方法描述及语法分析表设计;语法分析方法描述:武汉理工 课程设计说明书在程序语言的语法定义中有许多采用递归定义。我们在对它进行语法分析时,编制的 处理
5、程序也采取递归的方式,可使其结构简单易读。但由于频繁地调用子程序大大地降 低了分析速度。递归下降法的主要思想是:对每个非终结符按其产生式结构写出相应语法分析子程 序。因为文法递归相应子程序也递归,子程序的结构与产生式结构几乎一致。所以称此 种方法称为递归子程序法或递归下降法。程序是以一个个单词的形式向后读取,读取到 if 之后就开始执行 E 的递归子程序, 程序根据布尔表达式的真假,进而选择执行相应的分支,即如果布尔表达式为真,就执 行 then 后面的赋值语句,如果布尔表达式为假,就执行 else 后面的赋值语句,递归子 程序 E 分别赋予布尔表达式真和假不同的地址, 并将跳转相应的信息写到
6、处理四元式的 结构体数组中去, E 执行完以后,回到 S中继续执行后面的,读取到 then 之后,就表示 当条件为真的时候,执行 then 之后的赋值表达式,处理赋值的信息写到处理四元式的 结构体数组中去,当读取到 else 之后,同理的执行当条件为假的时候的赋值表达式, 处理完了之后赋值相应的信息也写到处理四元式的结构体数组中去, 这样反复执行就实 现的对语法的分析。语法分析表设计:实验要求的是递归下降法, 主要是调用不同的递归子程序, 所以没有什么语法分析表, 流程图在后面。按给定的题目给出中间代码形式的描述及中间代码序列 的结构设计;4.1if-else 四元式表示的描述 : 中间代码,
7、也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。 四元式可看成中间代码的一种抽象形式。武汉理工 课程设计说明书编译系统的概要设计5.1 概要分析:首先在源程序相同的目录下创建一个 txt 文档,并在文档中输入需要编译的程序即 if-else 语句,然后定义一个输入流文件, 利用这个流文件中的 open 函数打开我需要编 译的 txt 文件,在调用初始化各种变量的初始化函数。接着开始进行词法分析, 词法分析程序的主要任务是对构成源程序的字符串从左到右 的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单 词。并确定其属性(如保留字、标识符、运算符、界限符和常
8、量等) 。再把它们转换成 长度统一的标准形式属性字。词法分析是编译过程中的第一个阶段,在语法分析前进行 。也可以和语法分析结合 在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。 单词的分类(五类):关键字:由程序语言定义的具有固定意义的标识符。也称为保留字或基本字。标识符:用来表示程序中各种名字的字符串。常 数:常数的类型一般有整型、实型、布尔型、文字型。界限符:如逗号、分号、括号等。但是我做的这个实验没有用到那么多东西, 词法分析的有效字符串为 : IF,ELSE,THEN, ,.=,= ,和从 a 到 z 的单个标识符,但是程序还是相对来说比较简单,复杂的表 达
9、式可能不能处理,以后会改进。而词法分析的结果就是将相应的单词赋予不同的属性 值,利用词法分析表将结果保存起来,为后面的语义分析做准备。词法分析完成之后就 是把词法分析的结果都显示出来。语法分析的过程在上面已经有了说明, 语法分析完了之后就是打印中间代码的四元式 形式,根据上面的结果,四元式的数组里面已经存储了编译的具体信息,之需要按照相 应的算符,将他们输出出来,即可看到中间代码的四元式表示形式。词法分析的具体实现: 词法分析的具体过程如下,首先将我们需要的编译的内容读到 a 这个数组之中,利 用输入流函数的 seekg() 和 get() 函数配合完成,在利用 for 循环将 a 数组的的空
10、格、 回车等无用的内容去掉, 从而将处理过后的转存到 a1 这个数组中, 在利用的这个数组 中符号书写的连贯性来进行进行词法分析。例如, then 的写法是先写 t ,再写 h,再写 e,再写 n,那么词法分析一个个单词来进行,发现 a1i 中存储的是 t ,在判断数组接 下来的三个单元里面存储的分别是 h、e、n,就能够识别关键字 then 了,其他的是一个 道理,处理完成之后就对每个单词的属性都做了出来,就实现了词法分析应该的功能,详细的算法描述(流程图或伪代码)武汉理工 课程设计说明书6.1 词法分析的全部代码:6.1 程序代码/有效字符串 : IF,ELSE,THEN, a,b,x,=
11、/*武汉理工 课程设计说明书文法 :S-id=id | if E then S else SE-id id id*/#include #include #include#define $ASSIGN 249#define $IF 250#define $THEN 251#define $ELSE 252#define $GREAT 253#define $LESS 248#define $ID 254 typedef struct Wtokenint type;char ch;Wtoken;typedef enumJUMP,JG ,JL,ASSIGN,ENDOpKind;typedef str
12、uctint label;/ 标号OpKind op;char par1,par2;unionchar result;int address;Fourtable;/ 四元式#define MAX_TOKEN 256 /Wtoken 表大小#define MAX_QUAD 256 / 四元式数组大小武汉理工 课程设计说明书Wtoken tokentableMAX_TOKEN;Fourtable quadMAX_QUAD;int token_index;/token 表索引int total_len;/token 表有效长度int quad_len;/ 四元式表有效长度int quad_index
13、;/ 四元式索引int label;ifstream ins;bool init(char 255);bool cifafenxi();void print();void ERROR();void S(int,int);void E(int,int,int);bool nexttoken();int newlabel();void yufafenxi();void printFourtable();void main()coutfname; if(!init(fname) return;if(!cifafenxi() return;char ch;while(1)if(ins.eof()bre
14、ak; insch;coutThe result of CIFA analyse :endl; print();coutendlendl; nexttoken();武汉理工 课程设计说明书coutThe Grammar:endl; yufafenxi();coutThe FourTable as followings:endl; printFourtable();int newlabel()return label+;bool init(char 255) token_index=0; total_len=0; quad_len=0; quad_index=0; label=100; ins.
15、open( | ios:in); if(ins.fail() cout 文件打开出错 !ch; if(ins.fail() break;if(ch=I) insbuf; if(strcmp(buf,F)=0) tokentabletotal_len+.type=$IF;else if(ch=T)武汉理工 课程设计说明书insbuf;if(strcmp(buf,HEN)=0)tokentabletotal_len+.type=$THEN;else if(ch=E)insbuf;if(strcmp(buf,LSE)=0)tokentabletotal_len+.type=$ELSE;else if
16、(ch=)tokentabletotal_len+.type=$GREAT;else if(ch=a & ch=total_len)return false;10武汉理工 课程设计说明书cur.type=tokentabletoken_index.type; cur.ch=tokentabletoken_index.ch; token_index+;return true;void ERROR(char str20)couterror! strendl;void S(int begin,int next)if(cur.type=$ID)char a,b;coutcur.ch;a=cur.ch;
17、if(!nexttoken()ERROR(S);if(cur.type!=$ASSIGN)ERROR(S);cout=;if(!nexttoken()ERROR(S);if(cur.type!=$ID)ERROR(S); coutcur.chendl; b=cur.ch; AD_RESULT(begin,ASSIGN,b,0,a); AD_ADDRESS(-1,JUMP,0,0,next); nexttoken();else if(cur.type=$IF)if(!nexttoken()ERROR(S);coutif E then S else Sendl; int etrue=newlabe
18、l(); int efalse=newlabel();11武汉理工 课程设计说明书E(begin,etrue,efalse); if(cur.type=$THEN) if(!nexttoken() ERROR(S);S(etrue,next);if(cur.type=$ELSE) if(!nexttoken()ERROR(S);S(efalse,next); else ERROR(S);elseERROR(S);void E(int begin,int etrue,int efalse)if(cur.type=$ID)char a,b;int mark=0;a=cur.ch; coutcur.
19、ch; if(!nexttoken() ERROR(E();if(cur.type=$GREAT) cout;mark=1; else if(cur.type=$LESS) cout;elseERROR(E();if(!nexttoken()12武汉理工 课程设计说明书ERROR(E();if(cur.type!=$ID)ERROR(E();coutcur.chendl;b=cur.ch;if(mark=0)AD_ADDRESS(begin,JL,a,b,etrue);if(mark=1)AD_ADDRESS(begin,JG ,a,b,etrue);AD_ADDRESS(-1,JUMP,0,
20、0,efalse);if(!nexttoken()ERROR(E();elseERROR(E();void yufafenxi()S(-1,1000);AD_RESULT(1000,END,0,0,-);void print() for(token_index=0;token_indextotal_len;token_index+) if(tokentabletoken_index.type=$IF)coutIF 关键字 endl; if(tokentabletoken_index.type=$ELSE) coutELSE 关键字 endl;if(tokentabletoken_index.t
21、ype=$THEN) coutTHEN 关键字 endl;if(tokentabletoken_index.type=$ID) couttokentabletoken_index.ch 标识符 endl; if(tokentabletoken_index.type=$ASSIGN) cout= 运算符 endl; if(tokentabletoken_index.type=$GREAT) cout 运算符 endl;if(tokentabletoken_index.type=$LESS) cout 运算符 endl;13武汉理工 课程设计说明书token_index=0;void printF
22、ourtable()for(int i=0;i-1) coutLquadi.label:;else cout ;if(quadi.op=JG) cout,quadi.par1,quadi.par2,Lquadi.address)endl;else if(quadi.op=JL) cout(,quadi.par1,quadi.par2,Lquadi.address)endl;else if(quadi.op=JUMP) cout,-,-,Lquadi.addressendl;else if(quadi.op=ASSIGN)cout(= ,quadi.par1,-,quadi.result)end
23、l;else if(quadi.op=END) cout-,-,-,-endl;软件的测试方法和测试结果以下是输入文件内容:IF (ad) THENx=f;14武汉理工 课程设计说明书ELSE x=t;ELSEIF (by) THENx=y;ELSE x=r;程序运行结果:图一 词法分析结果图二 文法分析15武汉理工 课程设计说明书图三 四元式输出16武汉理工 课程设计说明书8. 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等)本次实验做的比较简单,不能对复杂的布尔表达式和复杂赋值语句进行处理 , 基本上 满足了实验的基本要求,输出的格式也符合四元式表示的形式,特点是基本实现了嵌套,可以实现对 =,=, 等的处理,体现出了递归下降法的思 想,递归函数的算法符合题目的要求。本次实验的不足还有很多,程序只能对单个字母的标识符进行识别,上面的错误例子1 就是这样的不足导致的。同时对于复杂的赋值语句也无法进行处理,也就是上面的错 误例子 2。对于带有运算符的赋值语句,暂时还没有实现,等以后水平提升了以后,应 该会进一步完善改算法。收获:通过本次实验,我收获了很错东西
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采购合同模板:乳胶漆
- 股权投资协议课件
- 2016疟疾培训课件
- 资阳环境科技职业学院《液压与气压传动1》2023-2024学年第二学期期末试卷
- 湖北省稳派教育2024-2025学年高三下学期第二次诊断性考试生物试题含解析
- 人教PEP版英语五年级下册教学课件Unit 5 Part A 第二课时
- 内蒙古经贸外语职业学院《营销效果评估与分析》2023-2024学年第二学期期末试卷
- 湖南冶金职业技术学院《软件学基础》2023-2024学年第二学期期末试卷
- 安阳幼儿师范高等专科学校《文艺学学科前沿》2023-2024学年第二学期期末试卷
- 中央财经大学《食品加工与制造》2023-2024学年第二学期期末试卷
- 车站作业计划与统计(第二版)
- YBJ-PS03-2004埋地无压预制混凝土排水圆形管管基及接口
- 碘对比剂的安全管理-PPT
- 完整版老旧小区改造工程施工组织设计方案
- 北京邮电大学2016年自主招生申请报告-(完整)
- 盟史简介12.10.18课件
- 一夜长大【主持人尼格买提个人随笔集】
- 全过程造价咨询服务实施方案
- 2022年安徽省淮北市电焊工电焊工模拟考试(含答案)
- 有限空间作业安全培训
- 神经内科住院医师规范化培训结业实践技能考核指导标准
评论
0/150
提交评论