编译原理课程设计报告.docx

上传人:b****4 文档编号:12404779 上传时间:2023-04-18 格式:DOCX 页数:33 大小:65.80KB
下载 相关 举报
编译原理课程设计报告.docx_第1页
第1页 / 共33页
编译原理课程设计报告.docx_第2页
第2页 / 共33页
编译原理课程设计报告.docx_第3页
第3页 / 共33页
编译原理课程设计报告.docx_第4页
第4页 / 共33页
编译原理课程设计报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

编译原理课程设计报告.docx

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

编译原理课程设计报告.docx

编译原理课程设计报告

2015级《编译原理课程设计》任务书

一、课程设计的性质和目的

编译原理课程设计是计算机专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握编译程序编写的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事高层次的计算机软件开发工作打下一定的专业基础。

二、设计课题

课题一:

应用编译原理的方法实现带括号的四则混合运算

给定条件:

1、词法符号定义如下:

INTCD+

FLOATC(D+.D+)|(D+.)|(.D+)

FLOATC((D+.D+)|(D+.)|(.D+)|(D+))(E|e)(+|−|λ)D+

OPADD+

OPSUB−

OPMUL*

OPDIV/

LPAREN‘(’

RPAREN‘)’

LINE‘\n’

ASSIGN=

2、表达式文法定义如下:

01.SE

02.ET

03.EEOPADDT

04.EEOPSUBT

05.TP

06.TTOPMULP

07.TTOPDIVP

08.PINTC

09.PFLOATC

10.PLPARENERPAREN

基本要求:

1、以ASSIGN作为文法结束符号;

2、应用词法分析技术识别单词;

3、应用SLR

(1)分析技术判别表达式的合法性;

4、应用尾动作文法技术计算表达式的类型与值;

5、要求表达式的类型与值严格一致。

课题二:

Micro语言词法语法分析

给定条件:

1、词法符号定义如下:

IDL(L|D)*

INTCD+

REALCD+D+

PLUS+

MULT*

LPAREN(

RPAREN)

COLON:

ASSIGN:

SEMI;

LINE’\n’

STOP

FEOFEOF

2、表达式文法定义如下:

01.PROGBEGINDECLBODYENDSTOP

02.DECLDECLVARIDCOLONTYPESEMI

03.DECLVARIDCOLONTYPESEMI

04.TYPEREAL

05.TYPEINTEGER

06.BODYBODYSEMISTM

07.BODYSTM

08.STMIDASSIGNEXP

09.STMWRITELPARENEXPRPAREN

10.STMREADLPARENIDRPAREN

11.EXPEXPPLUSFACT

12.EXPFACT

13.FACTFACTMULTPRIM

14.FACTPRIM

15.PRIMID

16.PRIMINTC

17.PRIMREALC

18.PRIMLPARENEXPRPAREN

基本要求:

1、以FEOF作为文法结束符号;

2、应用词法分析技术识别单词;

3、应用SLR

(1)分析方法进行语法分析;

4、报错要指明所在行。

三、课程设计报告要求

1、课程设计报告必须按本系规定的格式要求打印成册;

2、课程设计报告每人一份,正文必须包含如下几个方面的内容:

1)基本设计思想;

2)主要数据结构;

3)总结与体会。

3、课程设计报告装订顺序:

封面、任务书、目录、正文、源程序清单。

四、选题及考核办法

1、一人一组,学号为奇数者做课题一,学号为偶数者做课题二。

2、成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。

五、设计进度安排

1、16周周一下午14:

00—17:

10

2、16周周二上午8:

00—11:

10

3、16周周三下午14:

00—17:

10

目录

一设计内容与设计要求6

1.1课程设计的性质和目的6

1.2设计课题6

二基本设计思想8

2.1词法分析8

2.2语法分析9

三主要数据结构4

四调试运行结果5

五总结与体会6

参考文献7

一设计内容与设计要求

1.1课程设计的性质和目的

编译原理课程设计是计算机专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握编译程序编写的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事高层次的计算机软件开发工作打下一定的专业基础。

 

1.2设计课题

课题一:

应用编译原理的方法实现带括号的四则混合运算

给定条件:

1、词法符号定义如下:

INTCD+

FLOATC(D+.D+)|(D+.)|(.D+)

FLOATC((D+.D+)|(D+.)|(.D+)|(D+))(E|e)(+|−|λ)D+

OPADD+

OPSUB−

OPMUL*

OPDIV/

LPAREN‘(’

RPAREN‘)’

LINE‘\n’

ASSIGN=

2、表达式文法定义如下:

01.SE

02.ET

03.EEOPADDT

04.EEOPSUBT

05.TP

06.TTOPMULP

07.TTOPDIVP

08.PINTC

09.PFLOATC

10.PLPARENERPAREN

基本要求:

1、以ASSIGN作为文法结束符号;

2、应用词法分析技术识别单词;

3、应用SLR

(1)分析技术判别表达式的合法性;

4、应用尾动作文法技术计算表达式的类型与值;

5、要求表达式的类型与值严格一致。

 

二基本设计思想

本计算器采用编译原理的方法构建,先用有穷自动机辅助进行词法,把字符串形式的算术表达式的格式标准化,分离出一个个词法单元。

然后采用SLR

(1)文法分析法进行文法分析,检查表达式的正确性。

并在过程中计算出已分析出的部分表达式的值。

最终得出表达式的值。

2.1词法分析

由于各词法元素都可以用正则表达式来表示,所以做词法分析时采用正则表达式形式化表示各个元素以便于程序实现。

四则混合运算各词法元素的正则表达式如下所示:

INTCD+

FLOATCD+.D+|D+.|.D+

FLOATC(D+.D+|D+.|.D+|D+)(E|e)(+|−|λ)D+

OPADD+

OPSUB−

OPMUL*

OPDIV/

LPAREN‘(’

RPAREN‘)’

LINE‘\n’

ASSIGN=

正则表达式把能够把各词法元素的格式用形式化的方法表示出来,是格式的判断能够用程序来完成,但最终写程序时,用正则表达式直接分析对人来说仍然是不太直接,不方便,所以把正则表达式转化为有限自动机,以是写程序实现词法分析方便。

如图1.1为四则混合运算的有限自动机。

 

图2.1四则混合运算的有限自动机

2.2语法分析

四则混合运算算术表达式符合SLR

(1)文法但不符合LR(0)文法,所以语法分析采用SLR

(1)语法分析方法。

四则混合运算算术表达式的产生式如下:

01.SE

02.ET

03.EEOPADDT

04.EEOPSUBT

05.TP

06.TTOPMULP

07.TTOPDIVP

08.PINTC

09.PFLOATC

10.PLPARENERPAREN

通过文法的产生式可以把四则混合运算算术表达式的文法中各个非终极符的FIRST集合和FOLLOW集合一一求出来,以便进行下一步分析。

其FIRST集和FOLLOW集如表2.1所示:

表2.1四则混合运算算术表达式文法中非终极符的FIRST集和FOLLOW集

符号

FIRST集合

FOLLOW集合

S

INTCFLOATCLPAREN

ASSIGN

E

INTCFLOATCLPAREN

ASSIGNOPADDOPSUBRPAREN

T

INTCFLOATCLPAREN

ASSIGNOPADDOPSUBRPARENOPMULOPDIV

P

INTCFLOATCLPAREN

ASSIGNOPADDOPSUBRPARENOPMULOPDIV

根据文法的产生式和FIRST集、FOLLOW集即可确定文法的规约活前缀DFA(SLR

(1)_DFA),如图2.2所示。

0

S·E

E·T

E·EOPADDT

E·EOPSUBT

T·P

T·TOPMULP

T·TOPDIVP

P·INTC

P·FLOATC

P·LPARENERPAREN

ES1

TS2

PS3

INTCS4

FLOATCS5

LPARENS6

2

ET·

TT·OPMULP

TT·OPDIVP

ASSIGNR2

OPADDR2

OPSUBR2

RPARENR2

OPMULS9

OPDIVS10

3

TP·

ASSIGNR5

OPADDR5

OPSUBR5

RPARENR5

OPMULR5

OPDIVR5

6

PLPAREN·ERPAREN

E·T

E·EOPADDT

E·EOPSUBT

T·P

T·TOPMULP

T·TOPDIVP

P·INTC

P·FLOATC

P·LPARENERPAREN

ES11

TS2

PS3

INTCS4

FLOATCS5

LPARENS6

7

EEOPADD·T

T·P

T·TOPMULP

T·TOPDIVP

P·INTC

P·FLOATC

P·LPARENERPAREN

TS12

PS3

INTCS4

FLOATCS5

LPARENS6

5

PFLOATC·

ASSIGNR9

OPADDR9

OPSUBR9

RPARENR9

OPMULR9

OPDIVR9

4

PINTC·

ASSIGNR8

OPADDR8

OPSUBR8

RPARENR8

OPMULR8

OPDIVR8

1

SE·

EE·OPADDT

EE·OPSUBT

ASSIGNR1

OPADDS7

OPSUBS8

图2.2SLR

(1)_DFA

9

TTOPMUL·P

P·INTC

P·FLOATC

P·LPARENERPAREN

PS14

INTCS4

FLOATCS5

LPARENS6

10

TTOPDIV·P

P·INTC

P·FLOATC

P·LPARENERPAREN

PS15

INTCS4

FLOATCS5

LPARENS6

8

EEOPSUB·T

T·P

T·TOPMULP

T·TOPDIVP

P·INTC

P·FLOATC

P·LPARENERPAREN

TS13

PS3

INTCS4

FLOATCS5

LPARENS6

14

TTOPMULP·

ASSIGNR6

OPADDR6

OPSUBR6

RPARENR6

OPMULR6

OPDIVR6

16

PLPARENERPAREN·

ASSIGNR10

OPADDR10

OPSUBR10

RPARENR10

OPMULR10

OPDIVR10

15

TTOPDIVP·

ASSIGNR7

OPADDR7

OPSUBR7

RPARENR7

OPMULR7

OPDIVR7

13

EEOPSUBT·

TT·OPMULP

TT·OPDIVP

ASSIGNR4

OPADDR4

OPSUBR4

RPARENR4

OPMULS9

OPDIVS10

12

EEOPADDT·

TT·OPMULP

TT·OPDIVP

ASSIGNR3

OPADDR3

OPSUBR3

RPARENR3

OPMULS9

OPDIVS10

11

PLPARENE·RPAREN

EE·OPADDT

EE·OPSUBT

RPARENS16

OPADDS7

OPSUBS8

根据SLR

(1)_DFA即可用构造文法的相应action表和goto表如表2.2和表2.3所示。

表2.2SLR

(1)_action

INTC

FLOATC

OPADD

OPSUB

OPMUL

OPDIV

LPAREN

RPAREN

ASSIGN

0

S4

S5

S3

1

S7

S8

R1

2

R2

R2

R2

R2

3

R5

R5

R5

R5

R5

R5

4

R8

R8

R8

R8

R8

R8

5

R9

R9

R9

R9

R9

R9

6

S4

S5

S6

7

S4

S5

S6

8

S4

S5

S6

9

S4

S5

S6

10

S4

S5

S6

11

S7

S8

S16

12

R3

R3

S9

S10

R3

R3

13

R4

R4

S9

S10

R4

R4

14

R6

R6

R6

R6

R6

R6

15

R7

R7

R7

R7

R7

R7

16

R10

R10

R10

R10

R10

R10

表2.3SLR

(1)_goto

E

T

P

0

1

2

3

1

2

3

4

5

6

11

2

3

7

12

3

8

13

3

9

14

10

15

11

12

13

有了文法的action表和goto表,就可以根据表中所指示的状态转移情况,编写程序并完成相应功能。

三主要数据结构

程序的主要数据结构为栈。

1词法分析中用一个栈来保存分析中到达的状态。

staticcharlexstack[BUFSIZE];

2语法分析中一个状态栈用来保存已到达的状态,一个符号栈用来保存已读入的符号或规约产生的符号中还没被规约掉的语法符号。

struct{

intstate;

TokenTypetoken;

}stack[BUFSIZE];

由于状态栈,与符号栈的出入栈是同步的所以两个栈写在同一个结构中。

当读入一个字符或前一个规约产生一个符号,之后若不能直接规约这将该符号入栈到token并跳转到新的状态,原状态入栈state。

当一个活前缀被规约,被规约符号出栈,相应状态也出栈。

 

四调试运行结果

 

正确的输入结果,得到值40

 

五总结与体会

编译原理这门学科对于我来说算是比较难懂的了,对于自己在过去一周的课程设

计中,我学到了不少的东西,当然是通过和同学交流讨论所学习到的,虽然不是很精通,

但是多少还是了解了一点皮毛,对于老师给我们的那段代码,我还是自己很好的看了一

下,对于程序的某些部分还是不怎么熟悉,所以在自己编译和调试过程中出现了不少的

问题和错误。

这次实验用是C语言,我一直对C++程序设计很感兴趣,这次正好派上了用场,也算一次C++程序开发的实例,让我对C++的知识更加融会贯通了。

这次实验中在增加一些语句的时候遇到的困难比较大,不过通过查资料和与同学讨论我最后解决了这个问题,也学到了很多的东西,在这次实验中充分理解了团结就是力量。

在编译程序实现的过程中反复使用了递归调用的思想,且也使用了模块化处理问题的思想,使用模块化的思想关键是在抽象阶段要抽象出对应的模块,且模块的层次必须是清晰的。

在实现此程序中,由于要实现关键字和符号表中字段的搜索,实现中就必须注意快速查找的方法,而在实现的过程中多次用到了二分搜索的方法,这是个比较快的搜索方法。

由于此程序的实现相对比较复杂,且不方便调试,改进时可以把此程序的词法分析,语法分析和执行原代码作为单独的测试程序来测试,这样也方便大家来调试。

通过本次的课设我知道了一个算法的设计是需要静下心来仔细的研究的,且实现中必须先了解程序的整个流程,也就是说在编程中首先必须看懂那些对应的UML图,只有在图的指导下,编程中才不会盲目,也有一定的方向性。

在这次课程设计中我学到了很多的东西,也认识到自己还有许多不足的地方需要改进,深刻认识到了要写好代码也需要很扎实的理论基础才能驾驭住这些代码,得到自己想要的程序。

编程中必须注意代码的规范,多写一些对应的注释是很必要的,要时刻想这代码并不是给你自己看的,而是必须要给别人看,因此我觉得代码的规范是相当重要的。

最后,非常感谢同学们和老师在课程设计中对我的帮助,让我能够完成这次任务,希望自己以后在学习上能更上一层楼。

 

参考文献

[1]金成植,金英.编译程序设计原理[M].北京:

高等教育出版社,2007

[2]胡元义,柯丽芳.编译原理学习指导[M].西安电子科技大学出版社,2004

[3]陈意云,张昱.编译原理实验教程[M].北京:

高等教育出版社,2009

[4](美)AndrewW.Appel,(美)MaiaGinsburg.编译原理C语言描述.北京:

人民邮电出版社,2006

附录(源程序)

#include

#include

#include

#defineBUFSIZE256

staticFILE*in;

staticFILE*out;

typedefenum{NONE=-3,FEOF,ERROR,

INTC,FLOATC,OPADD,OPSUB,OPMUL,OPDIV,LPAREN,RPAREN,LINE,ASSIGN,

S,E,T,P//文法的非终极符11-13

}LexType;

#defineMacro_caseD'0':

case'1':

case'2':

case'3':

case'4':

case'5':

\

case'6':

case'7':

case'8':

case'9'

LexTypelex(char*word)

{staticintlexstacktop=-1;

staticcharlextryword[BUFSIZE];

staticcharlexstack[BUFSIZE];

staticLexTypelextryflag[BUFSIZE];

staticcharlexcurch='';

staticLexTypelexstateflag[]={ERROR,INTC,FLOATC,ERROR,ERROR,ERROR,FLOATC,OPADD,OPSUB,OPMUL,OPDIV,LPAREN,RPAREN,LINE,ASSIGN};

intstate=0;

intlexindex=0;

do{if(lexstacktop==-1)

lexcurch=fgetc(in);

elselexcurch=lexstack[lexstacktop--];

}while(lexcurch==''||lexcurch=='\t');

while

(1)

{switch(state){

case0:

switch(lexcurch){

caseMacro_caseD:

state=1;break;

case'.':

state=3;break;

case'+':

state=7;break;

case'-':

state=8;break;

case'*':

state=9;break;

case'/':

state=10;break;

case'(':

state=11;break;

case')':

state=12;break;

case'\n':

state=13;break;

case'=':

state=14;break;

default:

state=-1;break;

};break;

case1:

switch(lexcurch){

caseMacro_caseD:

state=1;break;

case'.':

state=2;break;

case'E':

case'e':

state=4;break;

default:

state=-1;break;

};break;

case2:

switch(lexcurch){

caseMacro_caseD:

state=2;break;

case'E':

case'e':

state=4;break;

default:

state=-1;break;

};break;

case3:

switch(lexcurch){

caseMacro_caseD:

state=2;break;

default:

state=-1;break;

};break;

case4:

switch(lexcurch){

caseMacro_caseD:

state=6;break;

case'+':

case'-':

state=5;break;

default:

state=-1;break;

};break;

case5:

switch(lexcurch){

caseMacro_caseD:

state=6;break;

default:

state=-1;break;

};break;

case6:

switch(lexcurch){

caseMa

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

当前位置:首页 > 职业教育 > 职高对口

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

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