编译课设LR方法输出四元式.docx

上传人:b****3 文档编号:5396069 上传时间:2023-05-08 格式:DOCX 页数:20 大小:215.96KB
下载 相关 举报
编译课设LR方法输出四元式.docx_第1页
第1页 / 共20页
编译课设LR方法输出四元式.docx_第2页
第2页 / 共20页
编译课设LR方法输出四元式.docx_第3页
第3页 / 共20页
编译课设LR方法输出四元式.docx_第4页
第4页 / 共20页
编译课设LR方法输出四元式.docx_第5页
第5页 / 共20页
编译课设LR方法输出四元式.docx_第6页
第6页 / 共20页
编译课设LR方法输出四元式.docx_第7页
第7页 / 共20页
编译课设LR方法输出四元式.docx_第8页
第8页 / 共20页
编译课设LR方法输出四元式.docx_第9页
第9页 / 共20页
编译课设LR方法输出四元式.docx_第10页
第10页 / 共20页
编译课设LR方法输出四元式.docx_第11页
第11页 / 共20页
编译课设LR方法输出四元式.docx_第12页
第12页 / 共20页
编译课设LR方法输出四元式.docx_第13页
第13页 / 共20页
编译课设LR方法输出四元式.docx_第14页
第14页 / 共20页
编译课设LR方法输出四元式.docx_第15页
第15页 / 共20页
编译课设LR方法输出四元式.docx_第16页
第16页 / 共20页
编译课设LR方法输出四元式.docx_第17页
第17页 / 共20页
编译课设LR方法输出四元式.docx_第18页
第18页 / 共20页
编译课设LR方法输出四元式.docx_第19页
第19页 / 共20页
编译课设LR方法输出四元式.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译课设LR方法输出四元式.docx

《编译课设LR方法输出四元式.docx》由会员分享,可在线阅读,更多相关《编译课设LR方法输出四元式.docx(20页珍藏版)》请在冰点文库上搜索。

编译课设LR方法输出四元式.docx

编译课设LR方法输出四元式

学号:

课程设计

 

题目

FOR循环语句的翻译程序设计

(LR方法、输出四元式)

学院

计算机科学与技术学院

专业

计算机科学与技术专业

班级

姓名

指导教师

陈天煌

 

2012

1

6

课程设计任务书

学生姓名:

专业班级:

指导教师:

陈天煌工作单位:

计算机科学与技术学院

题目:

FOR循环语句的翻译程序设计(LR方法、输出四元式)

初始条件:

理论:

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

实践:

计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码四元式的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:

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

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

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

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

5编译系统的概要设计;

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

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

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

9参考文献(按公开发表的规范书写)。

时间安排:

设计安排一周:

周1、周2:

完成系统分析及设计。

周3、周4:

完成程序调试及测试。

周5:

撰写课程设计报告。

设计验收安排:

设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:

设计周的次周星期一上午10点。

 

指导教师签名:

2011年11月18日

系主任(或责任教师)签名:

2011年11月18日

FOR循环语句的翻译程序设计

——LR方法、输出四元式

1系统描述

1.1目的

通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。

1.2设计内容

本设计按照要求设计出for语句的简单文法,并使用LR分析法对用户输入的程序进行分析和翻译。

对下列正确的程序输入:

for(i=0;i<10;i++)

{

m=m+i;

}

结果程序要对该输入进行词法分析,然后利用LR分析法对词法分析后得到的单词序列进行语法分析,经过语法制导翻译显示出等价的四元式表示的中间代码。

对于错误的程序输入,如:

for(i=0;i<8)

{

m=m+i;

}

结果程序要指出程序出错。

1.3翻译过程

词法分析:

词法分析是编制一个读单词的过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

程序语言的单词符号一般分为五种:

关键字(保留字/基本字)if、while、begin…;标识符:

常量名、变量名…;常数:

34、56.78、true、‘a’、…;运算符:

+、-、*、/、〈、and、or、….、;界限符:

,;(){}/*…。

语法分析:

语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。

此次设计中语法分析中主要通过LR分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。

中间代码生成:

为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。

常用的几种中间语言有:

逆波兰式、四元式、三元式、树表示。

本课程设计主要实现四元式的生成。

1.4初始条件

理论:

掌握一种计算机高级语言的使用。

学完编译课程,掌握词法分析程序设计方法,LR语法分析方法,以及语法制导的翻译和中间代码生成技术。

实践工具和环境:

计算机实验室提供计算机及软件环境。

1.5开发平台

所使用的系统:

Windows7

程序开发工具:

VisualC++6.0

程序设计语言:

C++语言

2文法及属性文法的描述

按照设计要求,设计出的For语句的符合简单优先定义的文法规则及相关的语义规则如下:

产生式语义规则

Sf(E;F;G){H;}goto

Sf(E;X;Y){H;}goto

Eid=cid.value=c.value;

Fid=c.valuegotoover;Gid++id.value=id.value+1;

Xid>cIfid.value<=c.valuegotoover;

Yid––id.value=id.value-1;

Hid1=id2+id3id1.value=id2.value+id3.value

Hid1=id2+cid1.value=id2.value+c.value

Hid1=c+id2id1.value=c.value+id2.value

其中产生式规则中的符号:

c表示常数const,f表示关键字for,i表示一般标识符id

3语法分析表设计

3.1有穷自动机和根据有穷自动机构造的LR(0)分析表

3.1.1有穷自动机:

3.1.2LR(0)分析表:

ACTION

GOTO

f

;

{

}

id

=

c

<

+

>

-

#

S

E

F

G

X

Y

H

0

S2

1

1

acc

2

S3

3

S5

4

4

S6

5

S7

6

S10

8

9

7

S11

8

S12

9

S13

10

S14

S15

11

R3

R3

R3

R3

R3

R3

R3

R3

R3

R3

R3

R3

R3

R3

12

S17

16

13

S19

18

14

S20

15

S21

16

S22

17

S23

18

S24

19

S25

20

R4

R4

R4

R4

R4

R4

R4

R4

R4

R4

R4

R4

R4

R4

21

R6

R6

R6

R6

R6

R6

R6

R6

R6

R6

R6

R6

R6

R6

22

S26

23

S27

24

S28

25

S29

26

S31

30

27

R5

R5

R5

R5

R5

R5

R5

R5

R5

R5

R5

R5

R5

R5

28

S31

32

29

R7

R7

R7

R7

R7

R7

R7

R7

R7

R7

R7

R7

R7

R7

30

S33

31

S34

32

S35

33

S36

34

S37

S38

35

S39

36

R1

R1

R1

R1

R1

R1

R1

R1

R1

R1

R1

R1

R1

R1

37

S40

38

S41

39

R2

R2

R2

R2

R2

R2

R2

R2

R2

R2

R2

R2

R2

R2

40

S42

41

S44

42

R8

R8

R8

R8

R8

R8

R8

R8

R8

R8

R8

R8

R8

R8

43

R9

R9

R9

R9

R9

R9

R9

R9

R9

R9

R9

R9

R9

R9

44

R10

R10

R10

R10

R10

R10

R10

R10

R10

R10

R10

R10

R10

R10

其中,S表示移进且下一状态为S的下标;R表示归约,归约所用的产生式为R的下标相对应的产生式;空白表示没有相应的关系即出错。

3.2LR语法分析过程的设计思想及算法

3.3翻译方法

设计中,使用语法制导翻译方法。

所谓语法制导的翻译方法是指:

按照给定的语法,对单词符号串进行语法分析,并构造出语法分析树,语法分析过程中根据需要构造属性依赖图,然后遍历语法树并在语法树的各个节点处,按语义规则进行计算,并生成中间代码。

所谓属性依赖图是一个有向图,用于描述分析树中的属性和属性间的相互依赖关系。

4中间代码形式的描述及中间代码序列的结构设计

本次设计,使用的中间代码为四元式(即三地址码)。

四元式的四个组成成分:

算符op,第一和第二运算对象ARG1和ARG2,及运算结果RESULT。

例如对语句:

for(i=0;i<20;i++)

{

emp=temp+i;

}

等价的四元式表示如下:

(1)(=,0,—,i)

(2)ifi>=20gotoover

(3)(+,temp,i,t)

(4)(=,t,—,temp)

(5)(+,i,1,i)

(6)goto

(2)

(7)over

设计并生成的结果程序,最终需要将用户输入的程序经过词法分析和语法分析,生成如上所述的四元式表示的中间代码形式。

5编译系统的概要设计

程序由词法分析和语法分析两部分构成:

词法分析程序,以用户输入的字符串为输入,判断输入是否包含非法字符,若字符完全合法,分析结果是,将标识符、常量、其他合法单词的类别和值保存在输入流中,做为语法分析的输入。

为了有效地编写词法分析程序,首先应构造出程序流程图,然后根据流程图编写程序。

语法分析,以词法分析结果作为输入,验证,输入流中各种符号是否符合语法规则。

若不符合,显示出错信息,否则,在分析过后显示与输入程序等价的中间代码。

同样需要构造语法分析的程序流程图。

6详细的算法描述

程序包括三个文件:

词法分析.cpp和for循环翻译.cpp。

其中for循环语句翻译.cpp中含有main函数,作为程序的入口,在main函数中接受用户输入的程序流,并保存在一个string对象中,然后调用词法分析.cpp中的voidgetSym(string&s,int&i)对程序流进行词法分析分离出单词符号,再调用语法分析.cpp文件中的voidgramCheck()函数对单词符号输入流进行语法分析和语义分析,并生成四元式形式的中间代码。

函数voidgetSym(string&s,int&i)调用getchar函数获得输入流中的符号进行分析,如得到的是标识符,则调用outsym函数分别普通标识符和关键字。

函数gramCheck()调用函数priCmp比较符号栈和输入流中的两个符号的优先级关系。

程序中的函数调用关系如下图:

6.1词法分析

在文件“词法分析.cpp”中编写词法分析程序,文件中主要包含一个结构体structsymNode,一个结构体数组symNodenode[100],取字符函数voidgetChar(string&s,int&i){ch=s[i];i++;},取单词函数voidgetSym(string&s,int&i),程序中数据结构和各函数具体功能如下:

(1)定义结构体:

structsymNode

{

inttype;

stringsValue;

inteValue;

};

此结构体用来保存词法分析后,各种单词的信息。

Type表示单词的类别,各符号对应的类别值见表1,如果单词是常量,eValue则保存该常量的值,如果单词是标识符,sValue则保存该标识符的值。

(2)数组symNodenode[100],用来保存单词输入流作为语法分析的输入流;

intposition=0;position保存数组node中将要输入的单词的位置,初值为0。

(3)函数voidgetSym(string&s,int&i);用来作词法分析,s存储用户的输入程序,i用来保存当前应该取字符的位置。

(4)函数

voidgetChar(string&s,int&i)

{ch=s[i];i++;}

用来取字符串s中第i个字符。

(5)函数voidoutSym(strings);区分s是关键字还是普通标识符。

词法分析程序的具体算法描述:

getChar()函数从串s里面取字符,直到遇到非空字符,如果已到达串尾,词法分析结束。

getSym()判断所取的字符是字母开头,还是以数字开头,还是其他合法字符;如果以字母开头,则开始保存为标识符,继续取字符直到遇到非字母非数字字符;如果以数字开头则保存为整数常量,继续取字符直到遇到非数字字符;其他字符则保存为相应类别。

所有的单词分离后保存到数组symNodenode[100]中。

词法分析程序所输出的单词符号常常采用以下二元式表示:

(单词种别,单词自身的值)。

单词的种别是语法分析需要的信息,而单词自身的值则是编译其他阶段所需要的信息。

词法分析的流程图,如下图:

 

6.2语法分析

在文件“for循环翻译.cpp”中编写语法分析程序。

程序中各函数具体功能解释如下:

intInitstack(stack&s):

初始化栈;

intpush(stack&s,chare):

将要入栈的元素压入栈中;

charpop(stack&s,char*e):

将要出栈的元素弹出栈;

intaction(intm,intn,chara):

对照LR分析表,判断输入的字符需要移进还是归约;

intgo(intm,intn,chara):

对照LR分析表,判断需要归约的字符串所对应的产生式;

在main函数中利用switch()语句来实现归约。

7测试方法和测试结果

7.1测试过程

针对所设计的关于 for循环语句的翻译程序,分别用正确的程序和有错误的程序进行测试,测试出结果程序的可用性和健壮性。

测试中分别使用了合法程序和非法程序,对结果程序进行测试,具体的测试程序、测试过程和测试结果如下:

for循环语句语法分析过程:

合法程序:

文件f1.txt如下图

输出结果保存在f2.txt中

非法程序:

文件f3.txt如下图:

输出结果保存在f2.txt中:

7.2测试结论

经过测试,可以得知,结果程序能达到预计的要求:

对合法程序进行词法分析和简单优先的语法分析,并生成四元式表示的中间代码;对于错误的程序输入,结果程序能够判断其出错。

]

存在问题:

对于错误的程序输入,结果程序不能给出错误的位置。

对于含有非法输入符号的程序,结果程序没有很好地处理,程序健壮性不强。

8研制报告

8.1研制过程

在课程设计期间,通过阅读大量相关书籍,利用网络查找各种资料,根据相关知识,写出了符合简单优先语法规则的关于for语句的属性文法。

获得语法规则的属性文法后,对程序进行了概要设计,将程序大致分为词法分析和语法分析两个模块,并且设计出文法对应的符号优先关系表。

词法分析负责对输入串进行单词识别,并保存单词各信息,作为语法分析和翻译的输入。

语法分析负责对输入流中的单词进行分析,检验是否符合所写的语法规则,并对其进行初步翻译。

概要设计后,对两个模块分别进行了详细设计,并利用词法分析流程图和语法分析流程图,设计程序的大致流程,并具体到各函数的设计。

通过对程序进行了详细设计,得到了程序大致流程,并根据流程进行编码,编码过程中,出现了一些语法和语义上错误,通过调试和修改,使得程序成功运行。

设计测试方法和测试用程序,并对程序进行了测试。

8.2本设计的评价

此次设计对for语句进行了全面词法分析和语法分析,并得到了用于分析for语句的结果程序。

结果程序能对用户输入的程序代码进行分析,判断是否存在词法错误和语法错误,如果出现错误,向用户给出提示,如果没有错误,则生成于输入程序等价的中间代码,方便后续编译过程工作。

但是结果程序也存在很多不足:

对于非法的输入,无法给出错误的位置。

对非法输入考虑不全面,对某些非法输入无法给出错误信息,另外属性文法不完善,程序中的使用的某些判断方法,只适合于本次设计使用的文法,实用性不强。

8.3个人心得体会

本课程设计是for循环语句的翻译程序,包括词法分析部分、语法分析部分和中间代码生成部分。

 词法分析阶段是编译过程的第一个阶段,是编译的基础。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。

语法分析部分采用LR分析方法进行语法分析,判断给出的符号串是否为该文法识别的句子。

中间代码生成器部分主要实现四元式的生成,将用中缀式表示的算术表达式转换为用四元式表示的算术表达式。

在语法分析的设计过程中,程序相当复杂,需要利用到大量的编译原理,其中在分析表的构造时遇到了非常大的困难,对输入字符串的移进和归约冲突得不到很好的处理,造成了调试的困难。

通过多次调试,最终构造出来分析表并调试成功。

通过本次课程设计,将编译的理论知识应用于实践,加深了对课本理论知识的理解,更好的掌握了编译技术的基本方法,了解了编译程序的一般分析过程,并且通过对for语句编译程序的设计和实现,对for语句也加深了认识和理解。

另外,编译程序的实现方法也适合于一般程序的编写,因此,此次课程设计对自己的编程能力的提升有很大帮助。

9参考文献

[1]张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第二版).清华大学出版社.2005年2月

[2]胡伦骏.编译原理(第2版).电子工业出版社.2005年2月

[3]陈火旺等.程序设计语言编译原理(第3版).国防工业出版社.2003年2月

[4]何炎祥.编译原理(第二版).武汉:

华中科技大学出版社.2005年8月

[5]陈意云.编译原理与技术(第二版).中国科学技术大学出版社.2002年1月

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

班级:

 姓名:

  学号:

序号

评分项目

满分

实得分

1

学习态度认真、遵守纪律

10

2

设计分析合理性

10

3

设计方案正确性、可行性、创造性

20

4

设计结果正确性

40

5

设计报告的规范性

10

6

设计验收

10

总得分/等级

评语:

注:

最终成绩以五级分制记。

优(90-100分)、良(80-89分)、中(70-79分)、

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

 

                      指导教师签名:

                  20年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

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

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