词法分析程序.docx

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

词法分析程序.docx

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

词法分析程序.docx

词法分析程序

目录

一.实验目的3

二.实验要求3

三.词法分析程序的算法思想及流程图:

3

四.核心代码4

五.结果分析8

六.实验问题12

七.总结12

一.实验目的

1.通过本次实验加深对词法分析器的工作过程的掌握。

2.使用C语言编写和调试相应的程序。

二.实验要求

1.实验环境要求在C或C++运行环境中执行

2.对单词的构词规则有明确的定义;

3.编写的分析程序能够正确识别源程序中的单词符号;

4.识别出的单词以<种别码,值>的形式保存在符号表中;

5.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;

保留字:

单词种别码为1。

包括if、int、for、while、do、return、break、continue;

标识符:

单词种别码为2。

常数:

单词种别码为3。

(常数为无符号整形数)

运算符:

单词种别码为4。

包括+、-、*、/、=、>、<、>=、<=、!

=;

分隔符:

单词种别码为5。

包括,、;、{、}、(、);

三.词法分析程序的算法思想及流程图:

在词法分析中,先以只读方式读取一个文件,自文件头开始扫描文本,滤去开头的空格、回车符、换行符等!

读取的字符送入缓冲区。

扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。

判断时要注意保留字和识别符之间的不同,单目运算符和双目运算符之间的不同。

因此可用指针进行处理。

还必须熟悉字符串函数的使用。

并要对非法字符作出错误提示。

文本扫描结束要判断词法分析是否成功。

最后是关闭文件,释放指针。

在源文件夹下建立一个out.txt的文本文件,放入需要分析的程序代码。

图3.1词法分析流程

 

四.核心代码

voidscan(FILE*fp)

{

intj;

ch=fgetc(fp);

while(ch==''||ch=='\n'||ch=='\t')//滤去开头的空格、回车符、换行符等

{

ch=fgetc(fp);

}

if(isalpha(ch))/*输入的是字母,进行标识符处理*/

{

buff[0]=ch;

i=1;

ch=fgetc(fp);//读下一个字符

while(isalnum(ch))/*如果是字母或者数字则将各个字符依次放入buff[]*/

{

buff[i]=ch;

i++;

ch=fgetc(fp);

}

buff[i]='\0';/*查找保留字*/

fseek(fp,-1,1);//从文件的当前位置返回到前一个字符位置

j=0;

while((j

j++;

if(j>=keyword)

{

output(2,buff);

}

else

{

output(1,buff);

}

}

elseif(isdigit(ch))

{

buff[0]=ch;

ch=fgetc(fp);

i=1;

while(isdigit(ch))/*如果是数字则整合数字*/

{

buff[i]=ch;

i++;

ch=fgetc(fp);

}

buff[i]='\0';/*整数整合结束*/

fseek(fp,-1,1);

output(3,buff);

}

elseif(strchr(fen,ch)>0)/*判断分隔符*/

{

buff[0]=ch;

ch=fgetc(fp);

buff[1]='\0';

fseek(fp,-1,1);

output(5,buff);

}

elseif(strchr(yun,ch)>0)/*判断运算符*/

{

buff[0]=ch;

if(ch=='=')/*双运算符*/

{

ch=fgetc(fp);

if(ch=='=')

{

output(4,"==");

}

else

{

fseek(fp,-1,1);

output(4,"=");

}

}

elseif(ch=='>')

{

ch=fgetc(fp);

if(ch=='=')

{

output(4,">=");

}

else

{

fseek(fp,-1,1);

output(4,">");

}

}

elseif(ch=='<')

{

ch=fgetc(fp);

if(ch=='=')

{

output(4,"<=");

}

else

{fseek(fp,-1,1);

output(4,"<");}}

elseif(ch=='!

')

{ch=fgetc(fp);

if(ch=='=')

{output(4,"!

=");}

else

{fseek(fp,-1,1);

output(0,"error!

");}}

else{ch=fgetc(fp);

buff[1]='\0';

fseek(fp,-1,1);

output(4,buff);}}

else/*无法识别的字符*/

{

buff[0]=ch;

buff[1]='\0';

ch=fgetc(fp);

fseek(fp,-1,1);

{

printf("\t非法字符%s\n",buff);}}

}

 

voidmain()

{

FILE*fp;

charfilename[20];

printf("数据类型定义规则:

\n");

printf("保留字--1标识符--2常数--3运算符--4分隔符--5\n");

printf("Typethefilenamewhichyouwanttoopen:

");

scanf("%s",&filename);

fp=fopen(filename,"r");/*以只读方式打开指定文件*/

if((fp=fopen(filename,"r"))==NULL)/*文件不存在输出错误*/

{

printf("Filedoesnotexist!

checkitagain");}

else

{

printf("<种别码,值>\n");

while(ch!

=EOF)

{

scan(fp);

}

printf("Theanalysisisover.\n");

printf("Thanksforusingthissoftware,haveagoodtime!

\n");

save();

}

fclose(fp);

getch();

};

五.结果分析

图5.1词法分析结果

图5.2词法分析结果

图5.3词法分析结果

图5.4词法分析结果

图5.5词法分析结果

图5.6词法分析结果

图5.7词法分析结果

六.实验问题

在本程序中,代码存在一定的问题,还不够完善强大,调试过程中存在很多问题。

现在也还不能完全分析单词。

程序的缺点也是非常的明显,程序只能在DOS环境下运行。

七.总结

分析本程序,对于一个整个的编译程序而言,还相差的很远。

还有很多的C语言的标识符和字符不能识别,所以形成了非法字符。

在今后的语法分析、语义分析中,还需要不断改进源程序。

学习编写程序能加深我们对编译原理理论的理解。

对整个过程能有更好的把握。

在自己手动实现词法分析时能更加方便。

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

当前位置:首页 > 经管营销 > 经济市场

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

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