C语言词法分析器内容说明注释完整可运行代码

上传人:宝路 文档编号:2983509 上传时间:2017-07-29 格式:DOC 页数:9 大小:401.01KB
返回 下载 相关 举报
C语言词法分析器内容说明注释完整可运行代码_第1页
第1页 / 共9页
C语言词法分析器内容说明注释完整可运行代码_第2页
第2页 / 共9页
C语言词法分析器内容说明注释完整可运行代码_第3页
第3页 / 共9页
C语言词法分析器内容说明注释完整可运行代码_第4页
第4页 / 共9页
C语言词法分析器内容说明注释完整可运行代码_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《C语言词法分析器内容说明注释完整可运行代码》由会员分享,可在线阅读,更多相关《C语言词法分析器内容说明注释完整可运行代码(9页珍藏版)》请在金锄头文库上搜索。

1、1. 实验目的及要求本次实验通过用 C 语言 设计、编制、调试一个词法分析子程序,识别单词,实现一个C 语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。运行环境:硬件:windows xp软件:visual c+6.02. 实验步骤1.查询资料,了解词法分析器的工作过程与原理。2.分析题目,整理出基本设计思路。3.实践编码,将设计思想转换用 c 语言编码实现,编译运行。4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。3. 实验内容

2、本实验中将 c 语言单词符号分成了四类:关键字 key(特别的将 main 说明为主函数) 、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key中,将界符分别由程序中的 case 列出。在词法分析过程中,关键字表和 case 列出的界符的内容是固定不变的(由程序中的初始化确定) ,因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词

3、,直到整个源程序全部扫描完毕,从而形成相应的单词串。输出形式例如:void $关键字流程图 、程序流程图:开始 输入源文件路径路径是否有效是初始化文件指针否 将字符加入字符数组 W o r d 是空格 , 空白或换行吗是字母吗 是数字吗否 否 是界符吗否打开源文件跳过该字符是是文件结束 ?否将字符加入字符数组 W o r d 否将字符加入字符数组W o r d 是指向下一字符识别指针内容指向下一字符是字母惑数字吗是将 w o r d 与关键字表 k e y 进行匹配否匹配 ?是输出 w o r d为关键字输出 w o r d 为普通标示符否将字符加入字符数组 W o r d 指向下一字符输出

4、w o r d为常数识别指针内容回退是数字吗是否输出 w o r d为界符指向下一字符结束是输出 W o r d内容为不可识别将字符加入字符数组W o r d 程序:#include#include#include#include/定义关键字char *Key10=main,void,int,char,printf,scanf,else,if,return;char Word20,ch; / 存储识别出的单词流int IsAlpha(char c) /判断是否为字母if(c=a)|(c=A) return 1;else return 0;int IsNum(char c) /判断是否为数字if

5、(c=0&c:ch=fgetc(fp); Word1=ch;if(ch=) printf(%st$运算符nn,Word);else fseek(fp,-1,1);printf(%st$运算符nn,Word);break;case%:ch=fgetc(fp); Word1=ch;if(ch=)printf(%st$运算符nn,Word);if(IsAlpha(ch) printf(%st$类型标识符nn,Word);else fseek(fp,-1,1);printf(%st$取余运算符nn,Word);break;default:printf(无法识别字符!nn); break;main()c

6、har in_fn30; /文件路径FILE *fp;printf(n 请输入源文件名(包括路径和后缀名):);while(1)gets(in_fn);/scanf(%s,in_fn);if(fp=fopen(in_fn,r)!=NULL) break; /读取文件内容,并返回文件指针,该指针指向文件的第一个字符else printf(文件路径错误!请重新输入:);printf(n* 词法分析结果如下 *n);doch=fgetc(fp);if(ch=#) break; /文件以#结尾,作为扫描结束条件 else if(ch= |ch=t|ch=n) /忽略空格,空白,和换行elsefseek

7、(fp,-1,1); /回退一个字节开始识别单词流scanner(fp);while(ch!=#);return(0);4.实验结果解析源文件:void main()int a=3;a+=b;printf(%d,a); return;#解析结果:5.实验总结分析通过本次实验,让再次浏览了有关 c 语言的一些基本知识,特别是对文件,字符串进行基本操作的方法。C 语言中没有 string 类型,因此本实验中的对字符串提取与识别均借助#include及字符型数组来实现。让我练习对字符串函数应用的同时也提高了自己的逻辑思维能力。在本次实验中,我纠正了一个一直以来的概念错误:main 不是关键字,它定义为程序的入口,是主函数!在本实验中,虽然我把 main 初始化在关键字表(字符指针类型数组)*Key10中,当与该数组中字符串进行比较时,若与 main 匹配成功,则返回 2,若为其他关键字则返回 1,以此来把 main 从关键字中区别出来。在本实验中的关键字表只初始化了几个常用的关键字,还可继续扩充(只需扩大数组,向其中补充要添加的关键字) 。如果要对本程序中未识别的 c 语言中的一些其他的字符进行扩充(目前处理为不可识别字符) ,可在程序代码中继续添加 case 选项,分别对相应要识别的特殊字符加以描述

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号