编译原理——词法分析器

编译原理——词法分析器

ID:38636886

大小:397.50 KB

页数:9页

时间:2019-06-16

编译原理——词法分析器_第1页
编译原理——词法分析器_第2页
编译原理——词法分析器_第3页
编译原理——词法分析器_第4页
编译原理——词法分析器_第5页
资源描述:

《编译原理——词法分析器》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、词法分析器学院:理学院班级:数学与应用数学——2学号:2008303574姓名:赵梦指导教师:李声1实验目的及要求本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。2运行环境:硬件:windowsxp软件:visualc++6.03实验步骤1.查询资料,了解词法分析器的工作过程与原理。2.分析题目,整理出基本设计思路。3.实践编码,将设计思想转换用c语言编码实现,编译运行。4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现

2、问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。4实验内容本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说

3、明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。输出形式例如:void$关键字 5流程图、程序流程图:程序:#include#include#include#include//定义关键字char*Key[10]={"main","void","int","char","printf","scanf","else","if","return"};charWord[20],ch;//存储识别出的单词流intIsAlpha(charc){/

4、/判断是否为字母if(((c<='z')&&(c>='a'))

5、

6、((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

7、]={''};charch;inti,c;ch=fgetc(fp);//获取字符,指针fp并自动指向下一个字符if(IsAlpha(ch)){//判断该字符是否是字母Word[0]=ch;ch=fgetc(fp);i=1;while(IsNum(ch)

8、

9、IsAlpha(ch)){//判断该字符是否是字母或数字Word[i]=ch;i++;ch=fgetc(fp);}Word[i]='';//''代表字符结束(空格)fseek(fp,-1,1);//回退一个字符c=IsKey(Word);//判断是否是关键字if(c==0)printf("%st$普通标识符",W

10、ord);//不是关键字elseif(c==2)printf("%st$主函数",Word);elseprintf("%st$关键字",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]='';fseek(fp,-1,1);//回退printf("%st$无符号实数",Word);}else//开始判断的字符不是字母也不是数字{Word

11、[0]=ch;switch(ch){case'[':case']':case'(':case')':case'{':case'}':case',':case'"':case';':printf("%st$界符",Word);break;case'+':ch=fgetc(fp);Word[1]=ch;if(ch=='='){printf("%st$运算符",Word);//运算符“+=”}elseif(ch=='+'){pri

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。