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

上传人:b****4 文档编号:4078888 上传时间:2022-11-27 格式:DOCX 页数:21 大小:32.38KB
下载 相关 举报
编译原理课程设计C语言编译器.docx_第1页
第1页 / 共21页
编译原理课程设计C语言编译器.docx_第2页
第2页 / 共21页
编译原理课程设计C语言编译器.docx_第3页
第3页 / 共21页
编译原理课程设计C语言编译器.docx_第4页
第4页 / 共21页
编译原理课程设计C语言编译器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

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

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

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

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

编译原理课程设计报告

课题名称:

C-语言编译器设计

 

提交文档学生姓名:

李杰

提交文档学生学号:

00

同组成员名单:

指导教师姓名:

金军

N不

指导教师评阅意见:

.

.

'

提交报告时间:

2010年6月10日

 

1.课程设计目标

实验建立C-编译器。

只含有scanner和parser部分。

2.分析与设计

(1)实现方法:

.

编程语言为C语言。

编程方法:

scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。

(2)扫描器:

C-惯用的词法

1、语言的关键字:

elseifintreturnvoidwhile

2、专用符号:

+-*/<<=>>===!

==;,()[]{}/**/

3、其他标记是ID和NUM,通过下列正则表达式定义:

ID=letterletter*NUM=digitdigit*letter=a|..|z|A|..|Zdigit=0|..|9

?

4、空格由空白、换行符和制表符组成。

空格通常被忽略,除了它必须分开ID、NUM关键字。

5.注释用通常的C语言符号/*...*/围起来。

注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。

注释不能嵌套

各单词的状态转换图(DFA图如下)词法结构见文件""中。

 

 

#

(3)分析器:

分析树结构见文件""中。

C-的BNF语法如下:

 

(4)代码设计说明:

#

程序结构:

语法分析函数parse通过调用词法分析函数getToken实现语法分析。

文件和函数的设计说明:

文件包含相应头文件,及main函数的实现;文件包含符号表和分析数的数据结构及在其它文件中使用的变量;文件和实现与词法分析和语法分析输出相关的函数printToken和printTree,以及分析树节点初始化相关的函数newStmtNode,newExpNode(Expkind)和copyString;文件和实现词法分析,主要函数为getToken;文件和实现语法分析,函数为与文法规则对应的函数。

关键数据结构

3.程序代码实现

文件代码如下:

==NULL)

{strcat(pgm,".tny");}

source=fopen(pgm,"r");

if(source==NULL)

{

fprintf(stderr,"file%snotfound\n",pgm);

return-1;

}

listing=stdout;

fprintf(listing,"\nC-COMPILATION:

%s\n",pgm);

~

}

else

{EOF_Flag=TRUE;

returnEOF;

}

}

elsereturnlineBuf[linepos++];

}

<

tr))

{

returnreservedWords[i].tok;

}

}

returnID;

}

TokenTypegetToken(void)

{

*/

intgcd(intu,intv)

{

if(v==0)returnu;

elsereturngcd(v,u-u/v*v);

/*u-u/v*v==umodv*/

}

voidmain(void)

{

intx;inty;

x=input();y=input();

output(gcd(x,y));

}

-

>=;<=;==;!

=;

错误用例:

/*AprogramtoperformEucild's

Algorithmtocomputegcd.*/

intgcd(intu,intv)

{returk;re9;

!

if(v==0)returnu;

"elsereturngcd(v,u-u/v*v);

/*umodv*/

}

语法分析用例:

正确用例:

()

/*Aprogramtoperformselectionsortona10

elementarray.*/

intx[10];

-

intminloc(inta[],intlow,inthigh)

{inti;intx;intk;

k=low;

x=a[low];

i=low+1;

while(i

{if(a[i]

%

{x=a[i];

k=i;}

i=i+1;

}

returnk;

}

voidsort(inta[],intlow,inthigh)

{inti;intk;

i=low;

while(i

{intt;

k=minloc(a,i,high);

t=a[k];

a[k]=a[i];

a[i]=t;

i=i+1;

}

}

voidmain(void)

{inti;

i=0;

while(i<10)

*

{x[i]=input;

i=i+1;}

sort(x,0,10);

i=0;

while(i<10)

{output(x[i]);

i=i+1;}

}

#

错误用例:

/*AprogramtoperformEucild's

Algorithmtocomputegcd.*/

intgcd(intu,intv

{

if(v==0returnu;

elsereturngcd(v,u-u/v*v);

/*u-u/v*v==umodv*/

~

}

voidmain(void)

{

intx,inty;

x=input();y=input();

output(gcd(x,y));

}

>=;<=;==;!

=;

词法分析结果输出:

正确结果:

C:

\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>compilersou

 

C-COMPILATION:

1:

/*AprogramtoperformEucild's

2:

Algorithmtocomputegcd.*/

3:

intgcd(intu,intv)

3:

reservedword:

int

3:

ID,name=gcd

3:

3:

reservedword:

int

3:

ID,name=u

3:

~

3:

reservedword:

int

3:

ID,name=v

3:

4:

{

4:

{

5:

if(v==0)returnu;

5:

reservedword:

if

5:

^

5:

ID,name=v

5:

==

5:

NUM,val=0

5:

5:

reservedword:

return

5:

ID,name=u

5:

;

6:

elsereturngcd(v,u-u/v*v);

`

6:

reservedword:

else

6:

reservedword:

return

6:

ID,name=gcd

6:

6:

ID,name=v

6:

6:

ID,name=u

6:

-

`

6:

ID,name=u

6:

/

6:

ID,name=v

6:

*

6:

ID,name=v

6:

6:

;

7:

/*u-u/v*v==umodv*/

^

8:

9:

}

9:

}

10:

voidmain(void)

10:

reservedword:

void

10:

ID,name=main

10:

10:

reservedword:

void

<

10:

11:

{

11:

{

12:

intx;inty;

12:

reservedword:

int

12:

ID,name=x

12:

;

12:

reservedword:

int

-

12:

ID,name=y

12:

;

13:

x=input();y=input();

13:

ID,name=x

13:

=

13:

ID,name=input

13:

13:

13:

;

13:

ID,name=y

13:

=

13:

ID,name=input

13:

13:

13:

;

14:

output(gcd(x,y));

14:

ID,name=output

14:

14:

ID,name=gcd

14:

14:

ID,name=x

14:

14:

ID,name=y

14:

14:

14:

;

15:

}

15:

}

16:

>=;<=;==;!

=;!

16:

>=

16:

;

16:

<=

%

16:

;

16:

==

16:

;

16:

!

=

16:

;

17:

EOF

错误结果:

`

C:

\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>compilersour

 

C-COMPILATION:

1:

/*AprogramtoperformEucild's

2:

Algorithmtocomputegcd.*/

3:

intgcd(intu,intv)

3:

reservedword:

int

3:

ID,name=gcd

3:

3:

reservedword:

int

3:

ID,name=u

3:

3:

reservedword:

int

3:

ID,name=v

!

3:

4:

{returk;re9;

4:

{

4:

ERROR:

4:

ID,name=returk

4:

;

4:

ID,name=re

4:

NUM,val=9

4:

;

5:

!

if(v==0)returnu;

5:

ERROR:

!

5:

reservedword:

if

5:

5:

ID,name=v

5:

==

5:

NUM,val=0

5:

5:

reservedword:

return

5:

ID,name=u

5:

;

6:

"elsereturngcd(v,u-u/v*v);

6:

ERROR:

"

6:

reservedword:

else

6:

reservedword:

return

~

6:

ID,name=gcd

6:

6:

ID,name=v

6:

6:

ID,name=u

6:

-

6:

ID,name=u

6:

/

;

6:

ID,name=v

6:

*

6:

ID,name=v

6:

6:

;

7:

/*umodv*/

8:

}

8:

}

*

9:

EOF

C:

\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>

语法分析的结果输出:

正确结果:

C:

\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>compilersour

 

"

C-COMPILATION:

Syntaxtree

:

Int

Id:

x

Vark:

10

Int

Id:

minloc

[

Hanshu

Int

Id:

a

Vark:

-1

Int

Id:

low

Int

Id:

high

Hanshuti

Int

Id:

i

Int

Id:

x

Int

Id:

k

Assignto:

k

Id:

low

Assignto:

x

Id:

a

Id:

low

Assignto:

i

Op:

+

Id:

low

Const:

1

While

Op:

<

Id:

i

Id:

high

Hanshuti

If

Op:

<

Id:

a

Id:

i

Id:

x

Hanshuti

Assignto:

x

Id:

a

Id:

i

Assignto:

k

Id:

i

<

Assignto:

i

Op:

+

Id:

i

Const:

1

Return

Id:

k

Void

Id:

sort

Hanshu

Int

Id:

a

Vark:

-1

Int

Id:

low

Int

Id:

high

@

Hanshuti

Int

Id:

i

Int

Id:

k

Assignto:

i

Id:

low

While

Op:

<

Id:

i

Op:

-

Id:

high

Const:

1

Hanshuti

Int

Id:

t

Assignto:

k

Id:

minloc

Id:

a

Id:

i

Id:

high

Assignto:

t

Id:

a

Id:

k

Assignto:

a

Id:

a

Id:

i

Assignto:

a

Id:

t

Assignto:

i

Op:

+

Id:

i

Const:

1

Void

Id:

main

Hanshu

Void

Hanshuti

Int

Id:

i

Assignto:

i

Const:

0

While

Op:

<

Id:

i

Const:

10

Hanshuti

Assignto:

x

'

Id:

input

Assignto:

i

Op:

+

Id:

i

Const:

1

Id:

sort

Id:

x

Const:

0

$

Const:

10

Assignto:

i

Const:

0

While

Op:

<

Id:

i

Const:

10

Hanshuti

Id:

output

Id:

x

Id:

i

Assignto:

i

Op:

+

Id:

i

Const:

1

~

错误结果:

MicrosoftWindowsXP[版本版权所有1985-2001MicrosoftCorp.

C:

\DocumentsandSettings\计算机学院专业实验室>cd桌面\compiler\Debug

C:

\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>compilersour

 

C-COMPILATION:

>>>Syntaxerroratline4:

unexoectedtoken->

{

>>>Syntaxerroratline5:

unexoectedtoken->

reservedword:

return

>>>Syntaxerroratline12:

unexoectedtoken->

reservedword:

int

>>>Syntaxerroratline16:

codeendbefore

 

Syntaxtree

:

Int

Id:

gcd

Hanshu

Int

Id:

u

Int

Id:

v

Hanshuti

If

Op:

==

Id:

v

Const:

0

Return

Id:

u

Return

Id:

gcd

Id:

v

Op:

-

Id:

u

Op:

*

Op:

/

Id:

u

Id:

v

Id:

v

Void

Id:

main

Hanshu

Void

Hanshuti

Int

Id:

x

Int

Id:

y

Int

Id:

z

Assignto:

x

Id:

input

Assignto:

y

Id:

input

Id:

output

Id:

gcd

Id:

x

Id:

y

C:

\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>

 

4.总结

收获:

1、熟悉C语言的结构、指针、文件方面的使用。

2、学会用startUml构造状态图,及用switch-case结构实现状态转换实现词法分析。

3、学会用递归下降方法实现EBNF文法规则,进而实现语法分析。

4、熟悉构造编译器的步骤及程序实现的框架及部分方法。

不足:

1、程序语法实现部分只用了递归下降分析一种方法。

2、此程序框架与教材《编译原理及实践》附录BTiny编译器的程序框架相似。

3、递归下降分析方法手工实现应经验少程序逻辑错误多,调试费时久,不能保证程序的高健壮性。

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

当前位置:首页 > 农林牧渔 > 林学

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

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