课程设计词法分析器.docx
《课程设计词法分析器.docx》由会员分享,可在线阅读,更多相关《课程设计词法分析器.docx(14页珍藏版)》请在冰点文库上搜索。
课程设计词法分析器
衡阳师范学院
《编译原理》课程设计
题目:
词法分析器
班级:
计算机科学系0901班
学号:
09190105091901090919011509190130
作者姓名:
侯阳琳李彩凤芦光霞张进
指导教师:
符军
2012年6月08日
目录
1.需求分析1
1.1问题描述1
1.2基本要求1
2.概要设计1
2.1待分析的简单语言词法1
2.2主要函数2
2.2流程图:
3
3.详细设计4
4.调试与分析8
4.1解析源文件8
4.2调试与分析9
4.3运行结果10
5.用户手册11
5.1运行环境11
5.2执行文件11
6.参考文献12
7.心得体会12
8.小组成员任务分配及工作进度安排12
1.需求分析
1.1问题描述
本次课程设计旨在是设计并实现一个具体的词法分析程序,加深对词法分析的原理的理解。
该词法分析程序能输入源程序并输出单词符号。
在扫描源程序字符串时,一旦识别出关键字、分隔符、标识符、无符号常数中之一,即以单词形式(各类单词均采用相同的结构,即二元式编码形式)输出。
每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。
1.2基本要求
1.对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词类型,单词符号)显示;
2.可以将要分析的程序保存到文件中进行读取;
3.删除无用的空白字符、回车符、及其它非实质性符号。
2.概要设计
2.1待分析的简单语言词法
(1)关键字"main","void","int","char","printf","scanf","else","if","return"
(2)运算符:
"+","-","*","/","="
(3)界符:
"{","}","[","]",";",",",".","(",")",":
"
(4)其他标记如字符串,表示以字母开头的标识符。
(5)空格、回车、换行符跳过。
2.2主要函数
intIsAlpha(charc)//判断是否为字母
intIsNum(charc)//判断是否为数字
intIsKey(char*Word)//识别关键字函数
voidscanner(FILE*fp)//扫描函数
2.2流程图:
3.详细设计
#include
#include
#include
#include
char//定义关键字
*Key[10]={"main","void","int","char","printf","scanf","else","if","return"};
charWord[20],ch;//存储识别出的单词流
intIsAlpha(charc)//判断是否为字母
{
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))return1;
elsereturn0;
}
intIsNum(charc)//判断是否为数字
{
if(c>='0'&&c<='9')return1;
elsereturn0;
}
intIsKey(char*Word)//识别关键字函数
{
intm,i;
for(i=0;i<9;i++)
{
if((m=strcmp(Word,Key[i]))==0)
{
if(i==0)
return2;
return1;
}
}
return0;
}
voidscanner(FILE*fp)//扫描函数
{
charWord[20]={'\0'};
charch;
inti,c;
ch=fgetc(fp);//获取字符,指针fp并自动指向下一个字符
if(IsAlpha(ch))//判断该字符是否是字母
{
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)||IsAlpha(ch))//判断该字符是否是字母或数字
{
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0';//'\0'代表字符结束(空格)
fseek(fp,-1,1);//回退一个字符
c=IsKey(Word);//判断是否是关键字
if(c==0)printf("%s\t$普通标识符\n\n",Word);//不是关键字
elseif(c==2)printf("%s\t$主函数\n\n",Word);
elseprintf("%s\t$关键字\n\n",Word);//输出关键字
}
else//开始判断的字符不是字母
if(IsNum(ch))
{//判断是否是数字
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)){
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0';
fseek(fp,-1,1);//回退
printf("%s\t$无符号实数\n\n",Word);
}
else//开始判断的字符不是字母也不是数字
{
Word[0]=ch;
switch(ch){
case'[':
case']':
case'(':
case')':
case'{':
case'}':
case',':
case'"':
case';':
printf("%s\t$界符\n\n",Word);break;
case'+':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='='){
printf("%s\t$运算符\n\n",Word);//运算符“+=”
}
elseif(ch=='+'){
printf("%s\t$运算符\n\n",Word);//判断结果为“++”
}
else{
fseek(fp,-1,1);
printf("%s\t$运算符\n\n",Word);//判断结果为“+”
}
break;
case'-':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='='){
printf("%s\t$运算符\n\n",Word);}
elseif(ch=='-'){
printf("%s\t$运算符\n\n",Word);//判断结果为“--”
}
else{
fseek(fp,-1,1);
printf("%s\t$运算符\n\n",Word);//判断结果为“-”
}
break;
case'*':
case'/':
case'!
':
case'=':
ch=fgetc(fp);
if(ch=='='){
printf("%s\t$运算符\n\n",Word);
}
else{
fseek(fp,-1,1);
printf("%s\t$运算符\n\n",Word);
}
break;
case'<':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='='){
printf("%s\t$运算符\n\n",Word);//判断结果为运算符“<=”
}
elseif(ch=='<'){
printf("%s\t$运算符\n\n",Word);//判断结果为“<<”
}
else{
fseek(fp,-1,1);
printf("%s\t$运算符\n\n",Word);//判断结果为“<”
}
break;
case'>':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')printf("%s\t$运算符\n\n",Word);
else{
fseek(fp,-1,1);
printf("%s\t$运算符\n\n",Word);
}
break;
case'%':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='='){printf("%s\t$运算符\n\n",Word);}
if(IsAlpha(ch))printf("%s\t$类型标识符\n\n",Word);
else{
fseek(fp,-1,1);
printf("%s\t$取余运算符\n\n",Word);
}
break;
default:
printf("无法识别字符!
\n\n");break;
}
}
}
main()
{
printf("////////////////////////////////////////////////////////////////////////////////\n\n");
printf("/**********************************词法分析器**********************************/\n\n");
printf("/*编译原理课程设计*/\n\n");
printf("/*0901班侯阳琳李彩凤芦光霞张进*/\n\n");
charin_fn[30];//文件路径
FILE*fp;
printf("\n请输入源文件名(包括路径和后缀名):
");
while(true){
gets(in_fn);
//scanf("%s",in_fn);
if((fp=fopen(in_fn,"r"))!
=NULL)break;
//读取文件内容,并返回文件指针,该指针指向文件的第一个字符
elseprintf("文件路径错误!
请重新输入:
");
}
printf("\n*******************词法分析结果如下*******************\n");
do{
ch=fgetc(fp);
if(ch=='#')break;//文件以#结尾,作为扫描结束条件
elseif(ch==''||ch=='\t'||ch=='\n'){}//忽略空格,空白,和换行
else
{
fseek(fp,-1,1);//回退一个字节开始识别单词流
scanner(fp);
}
}while(ch!
='#');
return(0);
}
4.调试与分析
4.1解析源文件
voidmain()
{
inta=3;
a+=b;
printf("%d",a);
return;
}
4.2调试与分析
1.未输入任何数据时,运行结果如下:
2.文件输入错误时,运行结果如下:
4.3运行结果
5.用户手册
5.1运行环境
*硬件环境:
多媒体计算机。
*软件环境:
Windows2003;MicrosoftVisualC++6.0。
5.2执行文件
*词法.exe
6.参考文献
【1】陈火旺.程序设计语言编译原理.北京:
国防工业出版社,2012
【2】王磊.编译原理上机指导.北京:
科学电出版社,2009
【3】AlfredV.Aho.编译原理.北京:
机械工业出版社,2009
7.心得体会
通过此次实验,让我们对实验原理有更深的理解.通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解。
通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。
了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解,熟悉了构造词法分析程序的手工方式的相关原理,使用C语言直接编写此法分析程序。
另外,也让我们熟悉了C语言的相关内容,加深了对C语言的用途的理解。
全面系统的理解了编译原理程序构造的一般原理和基本实现方法。
把死板的课本知识变得生动有趣,激发了学习的积极性。
把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。
8.小组成员任务分配及工作进度安排
小组成员:
侯阳琳、李彩凤、芦光霞、张进
任务分配:
李彩凤、张进主要负责程序编程和调试
侯阳琳、芦光霞主要负责文本输入、排版工作及心得体会
工作进度安排:
第十六周:
李彩凤、张进编写和调试程序
第十七周:
侯阳琳、芦光霞对文本进行输入和排版