课程设计词法分析器.docx

上传人:b****3 文档编号:10573937 上传时间:2023-05-26 格式:DOCX 页数:14 大小:281.47KB
下载 相关 举报
课程设计词法分析器.docx_第1页
第1页 / 共14页
课程设计词法分析器.docx_第2页
第2页 / 共14页
课程设计词法分析器.docx_第3页
第3页 / 共14页
课程设计词法分析器.docx_第4页
第4页 / 共14页
课程设计词法分析器.docx_第5页
第5页 / 共14页
课程设计词法分析器.docx_第6页
第6页 / 共14页
课程设计词法分析器.docx_第7页
第7页 / 共14页
课程设计词法分析器.docx_第8页
第8页 / 共14页
课程设计词法分析器.docx_第9页
第9页 / 共14页
课程设计词法分析器.docx_第10页
第10页 / 共14页
课程设计词法分析器.docx_第11页
第11页 / 共14页
课程设计词法分析器.docx_第12页
第12页 / 共14页
课程设计词法分析器.docx_第13页
第13页 / 共14页
课程设计词法分析器.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

课程设计词法分析器.docx

《课程设计词法分析器.docx》由会员分享,可在线阅读,更多相关《课程设计词法分析器.docx(14页珍藏版)》请在冰点文库上搜索。

课程设计词法分析器.docx

课程设计词法分析器

衡阳师范学院

《编译原理》课程设计

 

题目:

词法分析器

班级:

计算机科学系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.小组成员任务分配及工作进度安排

小组成员:

侯阳琳、李彩凤、芦光霞、张进

任务分配:

李彩凤、张进主要负责程序编程和调试

侯阳琳、芦光霞主要负责文本输入、排版工作及心得体会

工作进度安排:

第十六周:

李彩凤、张进编写和调试程序

第十七周:

侯阳琳、芦光霞对文本进行输入和排版

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

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2