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

上传人:b****6 文档编号:18872871 上传时间: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

*

>

:

;

{

}

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:

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}

E

{(,id}

{},;

+,),#}

T

+,),*,#}

F

{(,id}

B

{then,do,and}

M

}

{id,while,if}

N

{{}

.文法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;

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

$

11

12

13

14

15

16

17

s2

acc

s3

s4

s5

s6

s7

r4

r3

s10

s13

r1

r2

s14

s23

s27

22

21

s15

s36

s41

38

r13

s43

s19

s18

18

r19

19

20

r17

r18

r16

23

s31

24

s34

s25

26

r14

27

28

29

s29

30

r15

s32

s33

r12

34

r11

r10

r8

r6

s39

39

40

action

r7

41

42

s45

43

44

r5

45

r9

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

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

语法制导翻译

归约动作

翻译方案

E→E+T

E→E1+T

{E.place=newtemp;

Emit(E.place’:

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

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.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>

B→id1>

id2

{B.truelist:

=makelist(nextquad);

B.falselist:

=makelist(nextquad+1);

emit(ifid1.place’>

’id2.place’goto__’);

emit(’goto__’);

M→id=E

{p:

nilthenemit(p’:

=’E.place)

S→ifBthenM

S→ifBthenAM

{backpatch(B.truelist,A.quad)

backpatch(B.falselist,nextquad)}

S→whileBdoM

S→whileA1BdoA2M

{backpatch(B.truelist,A2.quad)

backpatch(B.falselist,nextquad+1)

emit(’goto’A1.quad)}

A1→∈{A1.quad:

A2→∈{A2.quad:

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

六.代码生成

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

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

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

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

.(+,A,B,T)→

MOVR,A;

ADDR,B;

STR,T

.(*,A,B,T)→

MULR,B;

.(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:

ccc:

d:

ifccc>

bandccc>

athena=b+a;

whileccc>

ddoa=d;

a=(b+ccc)*a+d

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

#include<

cstdio>

iostream>

cstdlib>

fstream>

string>

cmath>

usingnamespacestd;

structtoken//词法token结构体

intcode;

//编码

intnum;

//递增编号

token*next;

};

token*token_head,*token_tail;

//token队列

structstr//词法string结构体

//编号

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;

//状

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

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

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

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