东北大学编译原理实验_第1页
东北大学编译原理实验_第2页
东北大学编译原理实验_第3页
东北大学编译原理实验_第4页
东北大学编译原理实验_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论