编译原理课程设计报告.docx
- 文档编号:12404779
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:33
- 大小:65.80KB
编译原理课程设计报告.docx
《编译原理课程设计报告.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计报告.docx(33页珍藏版)》请在冰豆网上搜索。
编译原理课程设计报告
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 报告