您的当前位置:首页正文

编译原理课程设计 2

2024-04-26 来源:东饰资讯网
 武汉理工大学《编译原理》课程设计说明书

学 号:

课 程 设 计

题 目 编译原理 学 院 专 业 班 级 姓 名 指导教师

计算机科学与技术 计算机科学与技术

2013 年 1 月 12 日

武汉理工大学《编译原理》课程设计说明书

课程设计任务书

学生姓名: 专业班级: 指导教师: 工作单位:计算机科学与技术学院 题目: IF-ELSE条件语句的翻译程序设计(递归下降法、输出四元式) 初始条件:

理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进

行设计。

要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体

要求)

(1) 写出符合给定的语法分析方法的文法及属性文法。 (2) 完成题目要求的中间代码四元式的描述。

(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:

1 系统描述(问题域描述); 2 文法及属性文法的描述;

3 语法分析方法描述及语法分析表设计;

4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计;

6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果;

8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。

时间安排:

设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名: 2013年 月 日 系主任(或责任教师)签名: 2013年 月 日

- 1 -

武汉理工大学《编译原理》课程设计说明书

IF-ELSE条件语句的翻译程序设计 (递归下降法、输出四元式表示)

1.系统描述(问题域描述)

本次实验使用windows XP的visual C++软件,利用递归下降法实现IF-ELSE的条

件语句的翻译程序设计,输出用四元式表示,程序只能处理简单的布尔表达式和最简单的赋值语句,布尔表达式能够实现大于、小于和等于的识别,也能处理关系运算符>=和<=的布尔表达式。

程序的词法分析的结果和用到的文法是显示到dos界面上,而语法分析的结果则保存在jieguo.txt中,打开它就知道语法分析的结果和中间代码的输出了。

2.文法及属性文法的描述

2.1文法的描述:

if->X then Y else Y;

X->idid>id; X->id<=id; X->id>=id; Y->id=id;

2.3属性文法的描述:

属性文法(也称属性翻译文法)是Knuth在1968年首先提出的。

它是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“特性”(称为属性)。

产生式 语义规则 - 2 -

武汉理工大学《编译原理》课程设计说明书

E.true:= biaozhi++; E.fals:= ebiaozhi++; S1.next:=S.next; S2.next:=S.next; S->if E then S1 else S2 S.code:=E.cod||

gen(E.true‘:’)||S1.code|| gen(‘goto’ S.next)|| gen(E.false‘:’)||S2.code

3 语法分析方法描述及语法分析表设计;

3.1语法分析方法描述:

在程序语言的语法定义中有许多采用递归定义。我们在对它进行语法分析时,编制的处理程序也采取递归的方式,可使其结构简单易读。但由于频繁地调用子程序大大地降低了分析速度。

递归下降法的主要思想是:对每个非终结符按其产生式结构写出相应语法分析子程序。因为文法递归相应子程序也递归,子程序的结构与产生式结构几乎一致。所以称此种方法称为递归子程序法或递归下降法。

程序是以一个个单词的形式向后读取,读取到if之后就开始执行E的递归子程序,程序根据布尔表达式的真假,进而选择执行相应的分支,即如果布尔表达式为真,就执行then后面的赋值语句,如果布尔表达式为假,就执行else后面的赋值语句,递归子程序E分别赋予布尔表达式真和假不同的地址,并将跳转相应的信息写到处理四元式的结构体数组中去,E执行完以后,回到S中继续执行后面的,读取到then之后,就表示当条件为真的时候,执行then之后的赋值表达式,处理赋值的信息写到处理四元式的结构体数组中去,当读取到else之后,同理的执行当条件为假的时候的赋值表达式,处理完了之后赋值相应的信息也写到处理四元式的结构体数组中去,这样反复执行就实

- 3 -

武汉理工大学《编译原理》课程设计说明书

现的对语法的分析。

3.2语法分析表设计:

实验要求的是递归下降法,主要是调用不同的递归子程序,所以没有什么语法分析表,流程图在后面。

4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;

4.1 if-else四元式表示的描述:

中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。 三地址代码可看成中间代码的一种抽象形式。

三地址代码通常有三种表示方法:四元式、三元式、间接三元式。我使用三元式输出实验的中间代码。

4.2 if-else四元式表示序列的就够设计:

三元式结构形式: 编号 (OP,ARG1,ARG2,RESULT) OP:操作符ARG1

ARG1:第一个运算对象 ARG2:第二个运算对象 RESULT:运算结果

If-else变成这种形式形式如下: If a>b goto t1 goto t2 t1:x=a; goto t50 t2:x=b; goto t50 t50:

5 编译系统的概要设计

5.1概要分析:

首先在源程序相同的目录下创建一个txt文档,并在文档中输入需要编译的程序即if-else语句,然后定义一个输入流文件,利用这个流文件中的open函数打开我需要编译的txt文件,在调用初始化各种变量的初始化函数。

接着开始进行词法分析,词法分析程序的主要任务是对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单

- 4 -

武汉理工大学《编译原理》课程设计说明书

词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换成长度统一的标准形式—属性字。

词法分析是编译过程中的第一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。 单词的分类(五类):

1. 关键字:由程序语言定义的具有固定意义的标识符。也称为保留字或基本字。 2. 标识符:用来表示程序中各种名字的字符串。

3. 常 数:常数的类型一般有整型、实型、布尔型、文字型。 4. 运算符:如+、- 、*、/ 等。 5. 界限符:如逗号、分号、括号等。

但是我做的这个实验没有用到那么多东西,词法分析的有效字符串为: IF,ELSE,THEN, <,>,.<=,>=,=,和从a到z的单个标识符,但是程序还是相对来说比较简单,复杂的表达式可能不能处理,以后会改进。而词法分析的结果就是将相应的单词赋予不同的属性值,利用词法分析表将结果保存起来,为后面的语义分析做准备。词法分析完成之后就是把词法分析的结果都显示出来。

语法分析的过程在上面已经有了说明,语法分析完了之后就是打印中间代码的三地址形式,根据上面的结果,三地址的数组里面已经存储了编译的具体信息,之需要按照相应的算符,将他们输出出来,即可看到中间代码的三地址表示形式。

5.2词法分析的具体实现:

词法分析的具体过程如下,首先将我们需要的编译的内容读到a[]这个数组之中,利用输入流函数的seekg()和get()函数配合完成,在利用for循环将a[]数组的的空格、回车等无用的内容去掉,从而将处理过后的转存到a1[]这个数组中,在利用的这个数组中符号书写的连贯性来进行进行词法分析。例如,then的写法是先写t,再写h,再写e,再写n,那么词法分析一个个单词来进行,发现a1[i]中存储的是t,在判断数组接下来的三个单元里面存储的分别是h、e、n,就能够识别关键字then了,其他的是一个道理,处理完成之后就对每个单词的属性都做了出来,就实现了词法分析应该的功能,

6 详细的算法描述(流程图或伪代码)

6.1词法分析的全部代码: char a1[1000]; char a[1000];

fin.open(\"2.txt\"); int pos=0; int l=0; char ch=0;

- 5 -

武汉理工大学《编译原理》课程设计说明书

do{ fin.seekg(pos); fin.get(a[l]); l++; pos++;

}while(a[l-1]!='#'); int i=0,j=0; for(i=0;i<=l-1;i++){ while(a[i]==' '||a[i]==10||a[i]==9) {i++;} a1[j++]=a[i]; } a1[j]='\\0'; int k=j-1; j=0; while(a1[j]!='#'){ if(a1[j]=='I'&&a1[j+1]=='F'){ cibiao[cichang++].type=1; j=j+2; } else if(a1[j]=='T'&&a1[j+1]=='H'&&a1[j+2]

=='E'&&a1[j+3]=='N'){ cibiao[cichang++].type=2; j=j+4; } else if(a1[j]=='E'&&a1[j+1]=='L'&&a1[j+2]=='S'&&a1[j+3]

=='E'){ cibiao[cichang++].type=3; j=j+4; } else if(a1[j]=='<'&&a1[j+1]=='='){

- 6 -

武汉理工大学《编译原理》课程设计说明书

cibiao[cichang++].type=8; j=j+2; }

else if(a1[j]=='>'&&a1[j+1]=='='){ cibiao[cichang++].type=9; j=j+2; } else if(a1[j]=='='){ cibiao[cichang++].type=4; j++; } else if(a1[j]=='<'){ cibiao[cichang++].type=5; j++; } else if(a1[j]>='a' && a1[j]<='z') { cibiao[cichang].type=6; cibiao[cichang++].ch=a1[j]; j++; } else if(a1[j]=='>'){ cibiao[cichang++].type=7; j++; } else{j++;} }

词法分析的属性: IF 1 THEN 2 ELSE 3 = 4 < 5 a-z 6 > 7 <= 8 >= 9

- 7 -

武汉理工大学《编译原理》课程设计说明书

输入txt文件名 初始化 词法分析 输出词法分析 E递归子程序 读取下一单词 语法分析:递归程序S 置结束标志 读取下一单词是IF,调用E 输出四元式表示代码 结束

7 软件的测试方法和测试结果

正确的:

输入:IF (a>=b) THEN IF (cELSE x=f;

ELSE IF (g ELSE x=j;# 结果为:

- 8 -

武汉理工大学《编译原理》课程设计说明书

- 9 -

武汉理工大学《编译原理》课程设计说明书

8.研制报告(研制过程,本设计的评价、特点、不足、收获与体会等)

本次实验做的比较简单,不能对复杂的布尔表达式和复杂赋值语句进行处理,基本上满足了实验的基本要求,输出的格式也符合三地址表示的形式,

特点是基本实现了嵌套,可以实现对>=,<=,<,>等的处理,体现出了递归下降法的思想,递归函数的算法符合题目的要求。

本次实验的不足还有很多,程序只能对单个字母的标识符进行识别。同时对于复杂的赋值语句也无法进行处理。对于带有运算符的赋值语句,暂时还没有实现,等以后水平提升了以后,应该会进一步完善改算法。

收获:通过本次实验,我收获了很错东西。首先对编译有了进一步的深刻理解,对递归下降法的思想有了很深的认识,同时对于语法分析的原理和过程都有了进一步的巩固,对于C++的编程水平也起到了锻炼的作用,巩固了平时所学的知识,真正做到了学以致用,对于各种结构体的运用也有了深刻的认识。

体会:在做实验的过程中,发现自己在编程序的过程中总是会忽略各种细节,从而导致每次都要改正很错小的低级错误才能正确运行,不仅浪费时间,还会影响到对其他错误地方的修改,在今后的编程中我会注意改正这方面的缺点,这样才能促使自己编程水平的不断进步。

编译原理是一门非常专业的学科,对于现阶段的我来说,只能掌握它的基本原理,然后在利用C++编程来具体实现,在编译和C++的互相印证中,我不仅对编译原理有了更深的理解,同时也锻炼了自己的动手编程能力,对于将知识转化为能力有了很大的帮助,总之,我学习到了很多的知识。

9 参考文献

【1】 张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第二版).清华大学出版社.2005 【2】 闵联营、何克右. C++程序设计教程. 武汉理工大学出版社. 2005

【3】 Stanley B.Lippman、Josee Lajoie、Barbara E.Moo著,李师贤、蒋爱军、梅晓勇、林

瑛 译. C++ Primer中文版. 2006

- 10 -

武汉理工大学《编译原理》课程设计说明书

本科生课程设计成绩评定表

班级: 姓名: 学号: 序号 1 2 3 4 5 6 评分项目 学习态度认真、遵守纪律 设计分析合理性 设计方案正确性、可行性、创造性 设计结果正确性 设计报告的规范性 设计验收 满分 10 10 20 40 10 10 总得分/等级 实得分 评语: 注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、

及格(60-69分)、60分以下为不及格

指导教师签名:

- 11 -

武汉理工大学《编译原理》课程设计说明书

2013 年 月 日

- 12 -

因篇幅问题不能全部显示,请点此查看更多更全内容