版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上编译原理程序设计实验报告实验题目班级:计算机1507班 姓名:罗艺博学号:一、实验目标:词法分析扫描器的设计实现。在程序源文件中输入类C语言程序源文件,设计词法分析扫描器,并以TOKEN类别码序列的形式输出扫描结果。二、实验内容:1.概要设计:将程序大致分为:主函数、识别器(有限自动机state_change)、词法分析器(state_to_code)三大部分。其中,主函数所完成的功能为:打开、读取、关闭文件(即C语言源程序),重置token串等。识别器的功能为:识别字符,完成token串的生成,判断词法错误等。词法分析器的功能为:生成token类别码,判断token
2、是否出错等。主函数、识别器、词法分析器关系图2.流程图词法分析扫描器流程图3.关键函数a. 识别器(有限自动机state_change)int state_change(state,ch) /识别器,有限自动机if(ch = ) | (ch = t) | (ch = n)/略去空格、TAB、换行 return 0; else if(IsAlpha(ch) = 1) | (ch = _)/判断是否为字母或_,从而判断是关键字、标识符、CT字符还是ST字符串 if(state = 1) return 2; else if(state = 2) return 2; else if(state = 7
3、) return 8; else if(state = 8) return 8; else if(state = 10) return 11; else if(state = 11) return 11; else if(state = 6)/考虑与PT相连的情况 state_to_code(state_before,token); i = 0; memset(token,0,10); return 2; else return -1; else if(IsNum(ch) = 1)/判断是否为数字,从而进一步判断是为IT,CT,KT if(state = 1) return 3; else i
4、f(state = 2) return 2; else if(state = 3) return 3; else if(state = 4) return 4; else if(state = 5) return 5; else if(state = 6)/考虑与PT相连的情况 state_to_code(state_before,token); i = 0; memset(token,0,10); return 3; else return -1; else if(ch = .)/判断是否为CT中的小数点 if(state = 3) return 4; else return -1; els
5、e if(ch = )/判断是否为CT字符 if(state = 1) return 7; else if(state = 6)/考虑与PT相连的情况 state_to_code(state_before,token); i = 0; memset(token,0,10); return 7; else if(state = 8) return 9; else return -1; else if(ch = )/判断是否为ST if(state = 1) return 10; else if(state = 6)/考虑与PT相连的情况 state_to_code(state_before,to
6、ken); i = 0; memset(token,0,10); return 10; else if(state = 11) return 12; else return -1; else/判断是否为PT if(state = 1) return 6; else if(state = 2)/考虑与IT,KT相连的情况 state_to_code(state_before,token); i = 0; memset(token,0,10); return 6; else if(state = 3)/考虑与CT相连的情况 state_to_code(state_before,token); i
7、= 0; memset(token,0,10); return 6; else if(state = 9)/考虑与CT字符相连的情况 state_to_code(state_before,token); i = 0; memset(token,0,10); return 6; else if(state = 12)/考虑与ST相连的情况 state_to_code(state_before,token); i = 0; memset(token,0,10); return 6; else if(state = 6) if(i = 1)&(ch = =)&(token0 = )|(token0
8、= )|(token0 = =) return 6; else return 0; else return -1; b. 词法分析器(state_to_code)int state_to_code(state_before,token)/词法分析器 int n; /循环 code1 = 0; code2 = 0;switch(state_before)case 2:/KT for(n=0; n6; n+) if(strcmp(token, KTn) = 0) code1 = 1; code2 = n; printf(n,code1,code2); /why改变不了全局的code1,code2
9、break; if(code1 = 0)/IT printf(n); break;case 3:/CT printf(n); break; case 5:/CT(小数) printf(n); break; case 6:/PT for(n=0; n18; n+) if(strcmp(token, PTn) = 0) code1 = 6; code2 = n; printf(n,code1,code2); /why改变不了全局的code1,code2 break; break; case 9:/CT字符 printf(n); break; case 12:/ST printf(n); break
10、; default :/不被任何词识别 printf(Sorry its going wrong!);return 0;c.判断函数int IsAlpha(char c)/判断是否为字母 if(c=a)&(c=A)&(c=0&c=9) return 1; else return 0;int IsKey(char *word)/判断是否为关键字 int m,n; for(n=0; n6; n+) if(m = strcmp(word, KTn) = 0) if(n = 0) return 2; return 1; return 0;int IsDelimiter(char *token)/判断是
11、否为界符 int m,n; for(n=0; n18; n+) if(m = strcmp(token, PTn) = 0) if(n = 0) return 2; return 1; return 0;源程序代码:(加入注释)#include #include #include FILE *fp;char input200; /存放输入字符串char token10;/存放构成单词符号的符号串char word10; /存放识别出的单词流char ch;/存放当前读入字符int p;/input下标int i=0; /token下标int state;/存放状态标记int code1; /t
12、oken类别码,1-KT,2-IT,3-CT,4-CTT,5-ST,6-PTint code2;int state_before;/存放之前状态int num;/存放整形值char *KT6 = int, main, void, if, else, char; /1char *PT18 = =, , )|(token0 = )|(token0 = =) return 6; else return 0; else return -1; int state_to_code(state_before,token)/词法分析器 int n; /循环 code1 = 0; code2 = 0;switc
13、h(state_before)case 2:/KT for(n=0; n6; n+) if(strcmp(token, KTn) = 0) code1 = 1; code2 = n; printf(n,code1,code2); /why改变不了全局的code1,code2 break; if(code1 = 0)/IT printf(n); break;case 3:/CT printf(n); break; case 5:/CT(小数) printf(n); break; case 6:/PT for(n=0; n18; n+) if(strcmp(token, PTn) = 0) cod
14、e1 = 6; code2 = n; printf(n,code1,code2); /why改变不了全局的code1,code2 break; break; case 9:/CT字符 printf(n); break; case 12:/ST printf(n); break; default :/不被任何词识别 printf(Sorry its going wrong!);return 0;int IsAlpha(char c)/判断是否为字母 if(c=a)&(c=A)&(c=0&c=9) return 1; else return 0;int IsKey(char *word)/判断是否为关键字 int m,n; for(n=0; n6; n+) if(m =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年江苏省泰州市单招职业倾向性考试题库及答案详解(考点梳理)
- 2025年石家庄工程职业学院单招职业技能考试题库及答案详解历年
- 2025年兰州现代职业学院单招职业适应性测试题库附答案详解(模拟题)
- 2025年自考专业(汉语言文学)题库试题带答案详解(完整版)
- 2023年河北承德市人民检察院所属事业单位招聘6人笔试模拟试题附答案详解
- 2026年温州职业技术学院单招职业适应性测试必刷测试卷附答案
- 2025年娄底职业技术学院单招职业技能考试题库带答案详解(突破训练)
- 2026年河南推拿职业学院单招职业适应性测试题库附答案
- 2026年四川航天职业技术学院单招职业倾向性考试必刷测试卷及答案1套
- 2025年甘肃省张掖市民乐县人民法院聘任特邀调解员笔试考试参考试题及答案解析
- GB/T 11239.1-2025光学和光子学手术显微镜第1部分:要求和试验方法
- 学前教育应聘
- 智能家具创投项目计划书
- 2024年河南省襄城县人民医院公开招聘医务工作人员试题带答案详解
- 钻床工考试题库及答案
- 国家集中带量采购政策培训
- 网页设计与开发(HTML5+CSS3) 课件 项目5 利用盒子模型布局网页
- 美国公立研究型大学学位项目评估的案例分析-朱永东
- 2025至2030年中国玉米淀粉行业市场现状分析及前景战略研判报告
- 船舶碰撞协议书
- DG-TJ08-2062-2025 住宅工程套内质量验收标准
评论
0/150
提交评论