版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.编译原理实验报告日期:班级: 题目:组员:15 / 15.1 实验目的及要求1. 通过设计、编写、调试一个具体的词法分析程序,加深对词法分析原理的理解。2. 掌握在对程序设计语言源程序进行扫描的过程中, 将其分解为各类单词的词法分析方法。2 实验平台Windows + VC + Win32 Console3 实验步骤1.查询资料,了解词法分析器的工作过程与原理。2.分析题目,整理出基本设计思路。3. 实践编码,将设计思想转换用c语言编码实现,编译运行。4. 测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代
2、码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 4 实验内容 4.1 实现下述功能, 并将分析结果保存在文件中. (既可以参考范例程序, 也可以独立完成)程序输入/输出示例: 输入一段C语言程序,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)输入源程序示例:main ( ) int a , b =10;int c ;c = a + b * 20;输出固定表格如下保留字表2单词类别表 单词类型单词种别标识符1保留字2常量3运算符4分界符5保留字地址指针int1float 2main3printf4运算
3、符表4分界符表5界符地址指针,1;2(3)45 算符地址指针+12*3/4=5输出动态表格如下常量表3标识符表1标识符地址指针a1b2c3常量地址指针101202符号表单词名称类别地址指针int21c13;52c13=45a11+41b12*432032;52单词名称类别地址指针int21c13;52c13=45a11+41b12*432032;52564.2 程序:#include#include#include#include /定义关键字char *Key10=main,void,int,char,printf,scanf,else,if,return;char Word20,ch; /
4、 存储识别出的单词流int IsAlpha(char c) /判断是否为字母if(c=a)|(c=A) return 1;else return 0; int IsNum(char c) /判断是否为数字if(c=0&c=9) return 1;else return 0;int IsKey(char *Word) /识别关键字函数int m,i;for(i=0;i9;i+)if(m=strcmp(Word,Keyi)=0)if(i=0)return 2;elsereturn 1; return 0;void scanner(FILE *fp) /扫描函数char Word20=0;char
5、ch;int i,c;ch=fgetc(fp); /获取字符,指针fp并自动指向下一个字符if(IsAlpha(ch) /判断该字符是否是字母Word0=ch;ch=fgetc(fp);i=1;while(IsNum(ch)|IsAlpha(ch) /判断该字符是否是字母或数字Wordi=ch;i+;ch=fgetc(fp); Wordi=0; /0 代表字符结束(空格)fseek(fp,-1,1); /回退一个字符c=IsKey(Word); /判断是否是关键字if(c=0) printf(ttntt%stt1t1ttn,Word);/不是关键字else if(c=2) printf(ttn
6、tt%stt2t3ttn,Word);elseprintf(ttntt%stt3t1ttn,Word); /输出关键字 else /开始判断的字符不是字母 if(IsNum(ch) /判断是否是数字 Word0=ch; ch=fgetc(fp); i=1; while(IsNum(ch) Wordi=ch; i+; ch=fgetc(fp); Wordi=0; fseek(fp,-1,1); /回退 printf(ttntt%stt3t1ttn,Word); else /开始判断的字符不是字母也不是数字 Word0=ch; switch(ch) case:printf(ttntt%stt5t7
7、ttn,Word); break; case:printf(ttntt%stt5t9ttn,Word); break; case(:printf(ttntt%stt5t3ttn,Word); break; case):printf(ttntt%stt5t4ttn,Word); break; case:printf(ttntt%stt5t5ttn,Word); break; case:printf(ttntt%stt5t6ttn,Word); break; case,:printf(ttntt%stt5t1ttn,Word); break; case:printf(ttntt%stt5t8ttn
8、,Word); break; case;:printf(ttntt%stt5t2ttn,Word); break; case+:ch=fgetc(fp); Word1=ch; if(ch=) printf(ttntt%stt4t6ttn,Word);/运算符+= else if(ch=+) printf(ttntt%stt4t6ttn,Word); /判断结果为+ else fseek(fp,-1,1); printf(ttntt%stt4t1ttn,Word); /判断结果为+ break; case-:ch=fgetc(fp); Word1=ch; if(ch=) printf(ttntt
9、%stt4t6ttn,Word); else if(ch=-) printf(ttntt%stt4t6ttn,Word); /判断结果为- else fseek(fp,-1,1); printf(ttntt%stt4t2ttn,Word); /判断结果为- break; case*:printf(ttntt%stt4t3ttn,Word);break; case/:printf(ttntt%stt4t4ttn,Word);break; case!: case=:ch=fgetc(fp); if(ch=) printf(ttntt%stt4t6ttn,Word); else fseek(fp,-
10、1,1); printf(ttntt%stt4t5ttn,Word); break; case:ch=fgetc(fp); Word1=ch; if(ch=) printf(ttntt%stt4t6ttn,Word); /判断结果为运算符= else if(ch=) printf(ttntt%stt4t6ttn,Word);/判断结果为 else fseek(fp,-1,1); printf(ttntt%stt4t6ttn,Word); /判断结果为:ch=fgetc(fp); Word1=ch; if(ch=) printf(ttntt%stt4t6ttn,Word); else fseek
11、(fp,-1,1); printf(ttntt%stt4t6ttn,Word); break; case%:ch=fgetc(fp); Word1=ch; if(ch=) printf(ttntt%stt4t6ttn,Word); if(IsAlpha(ch) printf(ttntt%st类型标识符t tn,Word); else fseek(fp,-1,1); printf(ttntt%s t取余运算符t tn,Word); break; default:printf(ttntt无法识别字符! tttt n); break; main()char in_fn30; /文件路径 FILE *
12、fp; printf(n请输入源文件名(包括路径和后缀名):); while(true)gets(in_fn);/scanf(%s,in_fn); if(fp=fopen(in_fn,r)!=NULL) break; /读取文件内容,并返回文件指针,该指针指向文件的第一个字符 else printf(文件路径错误!请重新输入:); printf(n* 单词类别表 *n); printf(ttntt单词类型t单词种别tn,Word); printf(ttntt标识符 t1 tn,Word); printf(ttntt保留字 t2 tn,Word); printf(ttntt常量 t3 tn,Wo
13、rd); printf(ttntt运算符 t4 tn,Word); printf(ttntt分界符 t5 tn,Word); printf(ttn,Word); printf(n* 保留字表 *n); printf(ttntt保留字 t地址指针tn,Word); printf(ttnttint t1 tn,Word); printf(ttnttfloat t2 tn,Word); printf(ttnttmain t3 tn,Word); printf(ttnttprintf t4 tn,Word); printf(ttn,Word); printf(n* 运算符表 *n); printf(t
14、tntt算符 t地址指针tn,Word); printf(ttntt+ t1 tn,Word); printf(ttntt t2 tn,Word); printf(ttntt* t3 tn,Word); printf(ttntt/ t4 tn,Word); printf(ttntt= t5 tn,Word); printf(ttntt其他 t6 tn,Word); printf(ttn,Word); printf(n* 分界符表 *n); printf(ttntt界符 t地址指针tn,Word); printf(ttntt, t1 tn,Word); printf(ttntt; t2 tn,W
15、ord); printf(ttntt( t3 tn,Word); printf(ttntt) t4 tn,Word); printf(ttntt t5 tn,Word); printf(ttntt t6 tn,Word); printf(ttn,Word); printf(n* 词法分析结果如下 *n); printf(ttntt单词名称t类别t地址指针tn,Word); do ch=fgetc(fp); if(ch=#) break; /文件以#结尾,作为扫描结束条件 else if(ch= |ch=t|ch=n) /忽略空格,空白,和换行 else fseek(fp,-1,1); /回退一
16、个字节开始识别单词流 scanner(fp); while(ch!=#); printf(ttn,Word); return(0); 5 实验结果5.1 解析源文件:main ( ) int a , b =10;int c ;c = a + b * 20;#5.2 解析结果:6 实验总结分析在本次实验,使我们再次浏览了有关C语言的一些基本知识,特别是对文件,字符串进行基本操作的方法。C语言中没有string类型,因此本实验中的对字符串提取与识别均借助#include及字符型数组来实现。让我们练习对字符串函数应用的同时也提高了自己的逻辑思维能力。 在本次实验中,我纠正了一个一直以来的概念错误:main不是关键字,它定义为程序的入口,是主函数!在本实验中,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年厦门南洋职业学院教师招聘考试备考题库及答案解析
- 2026年厦门海洋职业技术学院教师招聘考试参考试题及答案解析
- 2026年华东政法大学教师招聘考试备考试题及答案解析
- 2026年南京师范大学泰州学院教师招聘考试备考题库及答案解析
- 小学英语四年级下册Unit 2写作技能提升教学设计
- 2026年河北对外经贸职业学院教师招聘考试参考试题及答案解析
- 2026年湖北国土资源职业学院教师招聘考试备考试题及答案解析
- 初中九年级物理(沪科版下册)单元整合与项目式学习教案
- 小学语文四年级下册第一次月考命题分析暨教学诊断与改进专题研讨
- 初中七年级英语跨学科项目化学习:泰国文化名片研创与东盟视域下国际理解教育导学案
- 08D800-8民用建筑电气设计与施工防雷与接地
- DZ∕T 0279.34-2016 区域地球化学样品分析方法 第34部分:pH值的测定 离子选择电极法(正式版)
- 依靠学习走向未来-陈武东(修改)
- 头晕与眩晕基层诊疗指南
- 大桥结构健康监测系统项目监理规划
- 读书分享读书交流会 《球状闪电》刘慈欣科幻小说读书分享
- 全国高中青年数学教师优质课大赛一等奖《导数在研究函数中的应用》课件
- 浅谈高中化学原创试题的命制
- 北师大版数学七年级下册知识点归纳总结
- 电梯井整体提升搭设安全专项施工方案(完整版)
- 项目RAMS系统保证计划SAP
评论
0/150
提交评论