词法分析程序.docx
- 文档编号:29432332
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:13
- 大小:296.74KB
词法分析程序.docx
《词法分析程序.docx》由会员分享,可在线阅读,更多相关《词法分析程序.docx(13页珍藏版)》请在冰豆网上搜索。
词法分析程序
目录
一.实验目的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语言的标识符和字符不能识别,所以形成了非法字符。 在今后的语法分析、语义分析中,还需要不断改进源程序。 学习编写程序能加深我们对编译原理理论的理解。 对整个过程能有更好的把握。 在自己手动实现词法分析时能更加方便。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析 程序