编译原理课程设计C语言编译器的实现.docx

上传人:b****6 文档编号:5884988 上传时间:2023-01-01 格式:DOCX 页数:60 大小:464.65KB
下载 相关 举报
编译原理课程设计C语言编译器的实现.docx_第1页
第1页 / 共60页
编译原理课程设计C语言编译器的实现.docx_第2页
第2页 / 共60页
编译原理课程设计C语言编译器的实现.docx_第3页
第3页 / 共60页
编译原理课程设计C语言编译器的实现.docx_第4页
第4页 / 共60页
编译原理课程设计C语言编译器的实现.docx_第5页
第5页 / 共60页
点击查看更多>>
下载资源
资源描述

编译原理课程设计C语言编译器的实现.docx

《编译原理课程设计C语言编译器的实现.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计C语言编译器的实现.docx(60页珍藏版)》请在冰豆网上搜索。

编译原理课程设计C语言编译器的实现.docx

编译原理课程设计C语言编译器的实现

扬州大学

编译原理课程设计

 

学号:

*********

姓名:

专业:

计算机科学与技术

课程:

编译原理

**********************

 

 

一.程序简介与分析---------------------------------------------------------3

二.程序适用范围-----------------------------------------------------------3

三.词法分析---------------------------------------------------------------3

四.语法分析---------------------------------------------------------------4

五.语义分析和中间代码生成------------------------------------------------10

六.代码生成--------------------------------------------------------------12

七.流程图----------------------------------------------------------------13

八.实现------------------------------------------------------------------14

九.程序运行结果----------------------------------------------------------14

十.总结------------------------------------------------------------------18

十一.附录(源程序)--------------------------------------------------------18

 

简单的编译程序设计

一.程序简介与分析

本程序由四个部分组成:

词法分析子程序,语法分析子程序,语义分析子程序,目标代码生成程序。

本程序输入一个叫libo.txt的c语言源程序,然后对它进行词法,语法,语义分析,并输出汇编代码。

词法分析输入的是c语言源程序,输出的3是具有独立语法意义的单词符号。

语法分析以词法分析产生的编码流为输入,按照SLR

(1)分析方法进行语法分析,产生语法树,输出移进和归约的动作,如果源程序不符合文法,则有“语法分析出错”的提示。

语义分析阶段,在语法分析的同时,在归约的时候,给出相应的语义动作,最后输出中间代码四元式和新的符号表,如果有未声明的变量出现,则会提示出出错,并显示出此变量的名称。

代码生成阶段,将语义分析得到的中间代码四元式转化为汇编语言的目标代码并输出。

二.程序适用范围

本程序的使用范围为:

整型常量,四则运算(为了简化问题,本程序只考虑加法运算和乘法运算)和布尔表达式以及相应的赋值语句,条件转移语句和循环语句。

 

三.词法分析

根据词法分析的需要,我将源程序中的单词符号分为:

保留字,字母(标识符),

界符三类,统一用一张表表示如下:

界符,保留字表

单词

=

+

*

>

:

;

{

}

and

if

then

while

do

int

标志符

编码

1

2

3

4

5

6

7

8

9

10

31

32

33

35

36

37

25

程序从源程序文件libo.txt中一次读入一个字符,并判断它是不是字母,界符,

保留字,空格,换行,结束符号或者非法字符。

流程图如下:

词法分析流程图

 

四.语法分析

.源程序中涉及的文法G[P]定义如下表:

说明语句

表达式

布尔表达式

句法

0、P’→P

1、P→id()L;R

2、L→L;D

3、L→D

4、D→id:

int

5、E→E+T

6、E→T

7、T→T*F

8、T→F

9、F→(E)

10、F→id

11、B→BandB

12、B→id>id

13、M→id=E

14、S→ifBthenM

15、S→whileBdoM

16、S→M

17、N→N;S

18、N→S

19、R→{N}

 

.上述文法的每个非终结符的FIRST集和FOLLOW集如下表:

FIRST集

FOLLOW集

P

{id}

{#}

L

{id}

{;}

D

{id}

{;}

E

{(,id}

{},;,+,),#}

T

{(,id}

{},;,+,),*,#}

F

{(,id}

{},;,+,),*,#}

B

{id}

{then,do,and}

M

{id}

{},;}

S

{id,while,if}

{},;}

N

{id,while,if}

{},;}

R

{{}

{#}

 

.文法G[P]的项目集部分如下:

0.P’→.P1.P’→P.

2.P→.id()L;R3.P→id.()L;R4.P→id(.)L;R

5.P→id().L;R6.P→id()L.;R7.P→id()L;.R

8.P→id()L;R.9.L→.L;D

10.L→L.;D11.L→L;.D12.L→L;D.

13.D→.id:

int14.D→id.:

int15.D→id:

.int

16.D→id:

int.17.E→.E+T18.E→E.+T

19.E→E+.T20.E→E+T.21.E→.T

22.E→T.23.T→.T*F24.T→T.*F

25.T→T*.F26.T→T*F.27.T→.F

28.T→F.29.F→(E)30.F→(.E)

31.F→(E.)32.F→(E).33.F→.id

34.F→id.

 

.再由项目集构造文法的DFA活前缀。

为了方便,省去了项目族集的每个状态的项目,直接在状态转换的箭头上标明终结符或非终结符。

对于有规约动作和接受的状态,将其特别标明。

文法G[P]的DFA图如下:

 

:

int说明语句

DidDid

R;L)(idP

{

ifBthenM

idandid句法

Sid=

}ifid

MN

;Sid

Mwhile

whileBdoM

idand

idB

布尔表达式>and

id

Tid

id(FE

*(

F(id

Fid+

E(表达式

+

)T

*

G[P]:

SLR

(1)分析表

Action

goto

id

;

:

*

+

>

=

{

}

int

and

if

then

while

do

$

P

D

R

E

T

F

B

M

S

L

N

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

0

1

2

3

4

5

6

7

8

9

10

0

s2

1

1

acc

2

s3

3

s4

4

s5

8

9

5

s6

6

s7

7

r4

8

r3

9

s10

10

s5

s13

12

11

11

r1

12

r2

13

s14

s23

s27

22

21

17

14

s15

15

s36

s41

16

38

37

16

r13

s43

r13

17

s19

s18

18

r19

19

s14

s23

s27

22

20

G[P]:

SLR

(1)分析表

Action

goto

id

;

:

*

+

>

=

{

}

int

and

if

then

while

do

$

P

D

R

E

T

F

B

M

S

L

N

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

0

1

2

3

4

5

6

7

8

9

10

20

r17

r17

21

r18

r18

22

r16

r16

23

s31

24

24

s34

s25

25

s14

26

26

r14

r14

27

s31

28

28

s34

29

s14

s29

30

30

r15

r15

31

s32

32

s33

33

r12

r12

r12

34

s31

35

35

r11

r11

r11

36

r10

r10

r10

r10

r10

37

r8

r8

r8

r8

r8

38

r6

r6

s39

r6

r6

39

s36

s41

40

G[P]:

SLR

(1)分析表

action

goto

id

;

:

*

+

>

=

{

}

int

and

if

then

while

do

$

P

D

R

E

T

F

B

M

S

L

N

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

0

1

2

3

4

5

6

7

8

9

10

40

r7

r7

r7

r7

r7

41

s36

s41

42

38

37

42

s45

s43

43

s36

s41

44

37

44

r5

r5

s39

r5

r5

45

r9

r9

r9

r9

r9

 

五.语义分析和中间代码生成

 载语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译的办法称作语法制导翻译。

语法制导翻译

归约动作

翻译方案

E→E+T

E→E1+T

{E.place=newtemp;

Emit(E.place’:

=’E1.place’+’T.place);}

E→T

E→T

{E.place:

=T.place;}

T→T*F

T→T1*F

{T.place=newtemp;

Emit(T.place’:

=’T1.place’+’F.place);}

T→F

T→F

{T.place:

=F.place;}

F→(E)

F→(E)

{F.place:

=E.place;}

F→id

F→id

{p:

=lookup(id.name);

ifp<>nilthenF.place:

=p

elseerror;}

B→BandB

B→B1andAB2

{backpatch(B1.truelist,A.quad);

B.truelist:

=B2.truelist;

B.falselist:

=merge(B1.falselist,B2.falselist);}

A→∈{A.quad:

=nextquad}

B→id>id

B→id1>id2

{B.truelist:

=makelist(nextquad);

B.falselist:

=makelist(nextquad+1);

emit(ifid1.place’>’id2.place’goto__’);

emit(’goto__’);}

M→id=E

M→id=E

{p:

=lookup(id.name);

ifp<>nilthenemit(p’:

=’E.place)

elseerror;}

S→ifBthenM

S→ifBthenAM

{backpatch(B.truelist,A.quad)

backpatch(B.falselist,nextquad)}

A→∈{A.quad:

=nextquad}

S→whileBdoM

S→whileA1BdoA2M

{backpatch(B.truelist,A2.quad)

backpatch(B.falselist,nextquad+1)

emit(’goto’A1.quad)}

A1→∈{A1.quad:

=nextquad}

A2→∈{A2.quad:

=nextquad}

语法翻译生成的四元式如下:

六.代码生成

目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。

这是编译的最后阶段,它的工作与硬件系统结构和指令含义有关,这个阶段的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。

本程序生成的目标代码与0x8086微处理器兼容。

下面列举几个简单的四元式与汇编代码的转化列子:

.(+,A,B,T)→

MOVR,A;

ADDR,B;

STR,T

.(*,A,B,T)→

MOVR,A;

MULR,B;

STR,T

.(J,_,_,L)→

JMPL

.(J>,A,B,L)→

MOVR,A

CMPR,B

JBL

.(=,A,_,T)→

LDR,A

STR,T

本程序生成的目标代码如下:

七.程序流程图

编译程序流程图

八.实现

本程序运行的硬件环境为CPU1.66HZ,内存为768M.软件环境为windowsxp

系统,VisualC++环境。

九.程序运行结果

1.输入源文件路径:

2.输出保留字

3.输出符号表的内容

5.输出语法分析的结果(本程序采用自下而上的LR语法分析)

6.输出中间代码

7.输出目标代码

十.总结

通过本次实验,我对编译程序各阶段有了更深刻更深入的了解,也纠正了自己在某些方面的的错误,丰富了自己关于编译原理方面的知识。

同时也培养了自己热爱思考,勤查资料的习惯。

由于水平本次实验涉及面并不是很全面,我只考虑了c语言的一个子集。

当然本程序的算法在某些地方也还存在一些缺陷。

 

十一.附录(源程序)

本程序输入的c源代码如下:

libo()

a:

int;

b:

int;

ccc:

int;

d:

int;

{

ifccc>bandccc>athena=b+a;

whileccc>ddoa=d;

a=(b+ccc)*a+d

}

本程序的完整源代码如下:

#include

#include

#include

#include

#include

#include

usingnamespacestd;

structtoken//词法token结构体

{

intcode;//编码

intnum;//递增编号

token*next;

};

token*token_head,*token_tail;//token队列

structstr//词法string结构体

{

intnum;//编号

stringword;//字符串内容

str*next;

};

str*string_head,*string_tail;//string队列

structivan//语法产生式结构体

{

charleft;//产生式的左部

stringright;//产生式的右部

intlen;//产生式右部的长度

};

ivancss[20];//语法20个产生式

structpank//语法action表结构体

{

charsr;//移进或归约

intstate;//转到的状态编号

};

pankaction[46][18];//action表

intgo_to[46][11];//语法go_to表

structike//语法分析栈结构体,双链

{

ike*pre;

intnum;//状

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

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1