编译原理课程设计打印.docx
《编译原理课程设计打印.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计打印.docx(13页珍藏版)》请在冰豆网上搜索。
![编译原理课程设计打印.docx](https://file1.bdocx.com/fileroot1/2023-1/6/9d13a5ed-e3c1-4de3-a54a-6134f54acdfd/9d13a5ed-e3c1-4de3-a54a-6134f54acdfd1.gif)
编译原理课程设计打印
课程设计(论文)任务书
软件学院学 院 软件测试专 业2 班
一、课程设计(论文)题目 词法分析器的设计与实现
二、课程设计(论文)工作自2014年6月16日起至2014年6月21日止。
三、课程设计(论文)地点:
软件学院实训中心
四、课程设计(论文)内容要求:
1.本课程设计的目的
进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编
译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时,
强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识,熟
悉使用开发工具VC/JAVA/C#/.NET。
2.课程设计的任务及要求
1)课程设计任务:
词法分析器的设计
词法分析器的实现
扫描器的设计与实现
2)创新要求:
在到达基本要求后,可进行创新要求。
3)课程设计论文编写要求
(1)课程设计任务及要求
(2)设计思路--工作原理、功能规划
(3)详细设计---数据分析、算法思路、功能实现(含程序流程图、主要代码及注
释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,
巩固了哪些知识,有哪些提高。
(6)报告按规定排版打印,要求装订平整,否则要求返工;
(7)课设报告的装订顺序如下:
封面---任务书---中文摘要---目录----正文---附录
(代码及相关图片)
(8)严禁抄袭,如有发现,按不及格处理。
4)课程设计评分标准:
(1)学习态度:
20分;
(2)系统设计:
20分;
(3)编程调试:
20分;
(4)回答问题:
20分;
(5)论文撰写:
20分。
5)参考文献:
(1)张素琴,吕映芝.编译原理[M].,清华大学出版社
(2)蒋立源、康慕宁等,编译原理(第2版)[M],西安:
西北工业大学出版社
6)课程设计进度安排
1.准备阶段(4学时):
选择设计题目、了解设计目的要求、查阅相关资料
2.程序模块设计分析阶段(4学时):
程序总体设计、详细设计
3.代码编写调试阶段(8学时):
程序模块代码编写、调试、测试
4.撰写论文阶段(4学时):
总结课程设计任务和设计内容,撰写课程设计论文
学生签名:
2014年6月21日
课程设计(论文)评审意见
(1)学习态度(20分):
优( )、良( )、中( )、一般( )、差( );
(2)系统设计(20分):
优()、良( )、中( )、一般( )、差( );
(3)编程调试(20分):
优( )、良( )、中( )、一般( )、差( );
(4)回答问题(20分):
优( )、良( )、中( )、一般( )、差( );
(5)论文撰写(20分):
优( )、良( )、中( )、一般( )、差( );
评阅人:
职称:
副教授
2014年6月26日
中文摘要
词法分析器的工作是低级别的分析:
将字符或者字符序列转化成记号.。
在谈论词法分析时,使用术语“词法记号”(简称记号)、“模式”和“词法单元”表示特定的含义。
在分析时,一是把词法分析器当成语法分析的一部分,另一种是把词法分析器当成编译程序的独立部分。
在前一种情况下,词法分析器不断地被语法分析器调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其Token值返回给语法分析器。
后一种情况则不同,词法分析器不是被语法分析器不断地调用,而是一次扫描全部单词完成编译器的独立一遍任务。
在分析时,一是把词法分析器当成语法分析的一部分,另一种是把词法分析器当成编译程序的独立部分。
在前一种情况下,词法分析器不断地被语法分析器调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其Token值返回给语法分析器。
后一种情况则不同,词法分析器不是被语法分析器不断地调用,而是一次扫描全部单词完成编译器的独立一遍任务。
词法分析器主要特点是不依靠语法,而只依靠词法,即处理一个单词时不依赖于外部单词的信息,因此词法分析器一般都很简单。
当然,对某些语言在作词法分析时,在有些情况下不得不往前查看多个字符,有时还要做一些特殊处理,还有一些在词法分析中处理不了的,要留到语法分析中进行处理。
本算法主要利用状态转换图生成一个词法分析器,对输入的程序进行词法分析,并将分析得到的单词造表。
其中关键字表和界限符表的大小是由高级语言的子集决定的,可以用数组装载;而标识符表和常数表的大小取决于输入的待分析程序中的变量、过程名、常数的个数,所以要用指针组成动态链表来装载。
当然为了方便,我们也把它定义成数组处理。
目 录
一、课程设计任务及要求1
二、需求分析3
三、设计思路4
四、详细设计6
五、运行调试与分析讨论10
六、设计体会与小结12
七、参考文献12
一、课程设计任务及要求
1、实验目的
设计并且实现一个简单的词法分析程序,由此可以加深对词法分析原理的理解,并能实践到应用中去。
2、实验要求
2.1语言的词法分类
(1)关键字:
beginifthenwhiledoend
所有关键字都是小写。
(2)运算符和界符:
:
=+–*/<<=<>>>==;()#
(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
(4)空格由空白、制表符和换行符组成。
空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。
2.2各种单词符号对应的种别码
单词符号
种别码
单词符号
种别码
begin
1
:
17
if
2
:
=
18
then
3
>
20
while
4
<>
21
do
5
<=
22
end
6
<
23
letter(letter|digit)*
10
>=
24
digitdigit*
11
=
25
*
13
;
26
/
14
(
27
+
15
)
28
-
16
#
0
二、需求分析
词法分析程序的功能:
输入:
所给文法的源程序input.txt文本文档。
输出:
四元组(type,name,rows,cols)构成的output.txt文本文档。
其中:
type为单词种别码;
Name为单词名称;
Rows为所在文件行号;
Cols为所在文件列号。
三、设计思路
从源程序中识别出具有特殊意义的单词,词法分析器根据扫描到单词符号的第一个字符的种类,可以拼出相应的单词符号。
3.1主程序示意图:
⑴关键字表
把关键字表预先安排在一张表格中,当扫描程序识别出标识符时,查关键字表。
如能查到匹配的单词,则该单词为关键字,否则为一般标识符。
关键字表为一个字符串数组,其描述如下:
Char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”};
否
是
图3-1
3.2扫描子程序
首先设置3个变量:
①token用来存放构成单词符号的字符串;②sum用来存放整型单词;③syn用来存放单词符号的种别码。
扫描子程序主要部分流程如图3-2所示。
图3-2
四、详细设计
1、变量初始化
charprog[81],token[8],ch,tmp;
intsyn,p,m,n,sum,rows;//syn:
存放单词符号的特征码
char*rwtab[6]={"begin","if","then","while","do","end"};//关键字
voidscaner();//词法分析函数
2、主函数的设计
voidmain()
{
FILE*out;
FILE*in;
rows=1;//行号
if((out=fopen("e:
\\output.txt","wt"))==NULL)//打开或建立一个文本文件,只允许写数据
{printf("\nonerrorbuidingd:
\\output.txt\n");
getch();
exit
(1);
}
if((in=fopen("e:
\\input.txt","rt"))==NULL)//只读打开一个文本文件,允许读数据
{printf("\nConn'tfoundd:
\\input.txt\n");
getch();
exit
(1);
}/*printf("\npleaseinputastring(endwith'#'):
\n");*/
rewind(in);
rewind(out);//重新指针开始指向一个流的开头
fprintf(out,"%-5s%-10s%-5s%5s\n","type","name","rows","cols");
do{
p=0;
do
{/*scanf("%c",&ch);*/
if(p==80)
{printf("\nonerrorcolunm'slengthmorethan80!
\n");//长度不可以大于80
getch();
exit
(1);
}
ch=fgetc(in);//读内容
prog[p++]=ch;
}while(ch!
=EOF&&ch!
='\n');//先执行,再判断ch,是就继续,不是就跳出。
prog[p]='#';
tmp=ch;
p=0;
do{
scaner();
switch(syn)
{case11:
fprintf(out,"%-5d%-10d%-5d%5d\n",syn,sum,rows,p);
break;
case-1:
printf("youhaveinputawrongstring,rowscols=(%d,%d)\n",rows,p);
getch();
exit(0);
default:
if(syn!
=0)fprintf(out,"%-5d%-10s%-5d%5d\n",syn,token,rows,p);
break;
}
}while(syn!
=0);
if(tmp=='\n')rows++;//换行
}while(ch!
=EOF);//直到是EOF为止跳出
fclose(in);
fclose(out);
}
3、词法扫描器的设计
voidscaner()
{sum=0;//存放整形单词
for(m=0;m<8;m++)token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch=='')||(ch=='\n'))ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))//标识符(字母加数字)syn=10
{token[m++]=ch;//token用来存放构成单词符号的字符串
ch=prog[p++];
}
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)//rwtab[]关键字表的时候,syn累加。
{syn=n+1;
break;
}
}
elseif((ch>='0')&&(ch<='9'))//数字syn为11
{while((ch>='0')&&(ch<='9'))
{sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;//回退一格。
syn=11;
}
elseswitch(ch)//其他情况根据ch的值的不同来分情况处理
{case'<':
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{syn=22;
token[m++]=ch;
}
else
{syn=20;
p--;
}
break;
case'>':
token[m++]=ch;
……等等根据ch的不同进行相应的case语句处理。
default:
syn=-1;
break;
}
token[m++]='\0';
}
五、运行调试与分析讨论
1、源程序的结果
输入input:
输出结果:
2、源程序:
begin
x<=$;
while
a<0
do
b<>9-x;
end
#
输出结果
6、设计体会与小结
通过这次课程设计我深刻的认识到词法分析器的重要性以及其中内在原理的实践过程,在设计中遇到了大大小小的问题,不过通过查找资料,互联网以及老师的帮助顺利的解决了这些问题。
感谢老师。
同时也让自己对编译原理有了感性的认识,对词法分析有了更深刻的了解。
7、参考文献
[1].吕映芝.《编译原理》.清华大学出版社.
[2].张素琴,吕映芝等.《编译原理》.清华大学出版社.
[3].李赣生. 《编译原理》.清华大学出版社.