实验11 根据状态转换图手工构造词法分析程序_第1页
实验11 根据状态转换图手工构造词法分析程序_第2页
实验11 根据状态转换图手工构造词法分析程序_第3页
实验11 根据状态转换图手工构造词法分析程序_第4页
实验11 根据状态转换图手工构造词法分析程序_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理 实验报告实验类型:单元实验 基础实验 / 选做实验实验名称:实验1.1 根据状态转换图手工构造词法分析程序姓名: _学号: _班级: _一、原创性声明参考代码:参考了两处代码,第一部分是关键字的定义,自己想的没有这位学长写的全面,所以就直接拿过来用了;第二部分是参考学长的文件读写操作部分。代码来源:百度文库编译原理课程设计词法分析器文档作者是烟大张金荣学长。二、实验要求1. 手工构造一个简单的词法分析程序。 - 能够识别标识符、整数、关键字、算符、界符- 可输出至文件,也可输出至屏幕1. 使用缓冲技术(单缓冲或双缓冲)2. 词法分析器作为一个子程序被语法分析器调用。± 每次

2、调用返回一个单词± 同时将单词及属性存入符号表 根据状态转换图手工构造词法分析程序。从以下方法中选一:² 直接转向法² 表驱动法三、完成情况l 功能1 : 基本内容² 功能描述: - 能够识别标识符、整数、关键字、算符、界符- 可输出至文件,也可输出至屏幕² 完成情况: 基本完成² Bug:能发现的bug都已修改,² 备注: 标识符、整数、关键字、算符、界符都是自定义的,并不能识别所有的标识符、整数、关键字、算符、界符l 功能2 : 选做内容功能描述: 使用缓冲技术(双缓冲)根据状态转换图手工构造词法分析程序:直接转向法&#

3、178; 完成情况: 基本完成² Bug: 能发现的bug都已修改,² 备注: 代码中有几个方法是多余的:bool isIdentifier(char *s)/*是否是标识符*/bool isNumber(char *s)/*是否为数字*/原本是想在main函数中调用这两个函数,使main函数结构更加简单明了,结果发现加不进去,会破坏代码的逻辑。四、实现方案状态转换图:五、创新和亮点创新之处:并没什么创新之处,亮点:用了GOTO语句,使代码易读性增强。 底层的操作都在最基本的函数中,其他函数再调用这些函数来实现自己的功能,这些函数又供其他函数调用。使代码逻辑性,易读性增强。

4、 Main函数中不写多余代码,调用其他方法,结构清晰。六、运行结果输入内容:输出结果(部分):七、源码/*/#include <iostream>#include <fstream>#include <string>using namespace std;/*各种变量的定义*/String keywords36 ="char","short","int","unsigned","long","float","double"

5、;,"struct","union","void","enum","const","typedef","auto","static","break","case","continue","default","do","else","for","if","return&q

6、uot;,"switch","while","sizeof","printf","FILE","fopen","NULL","fclose","exit","read","close","fprintf"char delimiters = '', '', '(', ')', ''

7、, '', ''', '"', ',', '', ':'char operators5 = '+','-','*','/','='ifstream infile; /*输入文件*/ofstream outfile; /*输出文件*/char buffer1 64;/*缓冲数组1*/char buffer2 64;/*缓冲数组2*/char *pointer; /*扫描指针*/*各种函数的声明*/bool

8、 isChar(char c);/*是否是字母*/bool isDigit(char c);/*是否是0-9*/bool isUnderline(char c);/*是否是下划线*/bool isEnter(char c);/*是否是换行*/bool isDelimiter(char c);/*是否是界符*/bool isOperator(char c);/*是否是运算符*/int getLength(char *s);/*求一个字符串的长度*/bool isIdentifier(char *s);/*是否是标识符*/bool isNumber(char *s);/*是否为数字*/bool i

9、sKeyword(char *s);/*是否是关键字*/char getChar();/*实现双缓冲扫描文件*/void write(string str1,string str2);/*写入文件,并且在屏幕上打印*/*程序入口:main函数*/int main() char cc= '0'string str = ""pointer=buffer1; buffer1 63=buffer2 63=-1; /数组尾数值为-1infile.open ("in.txt",ios:binary);/二进制文件 outfile.open (&quo

10、t;out.txt",ios:trunc);/再次写入覆盖文件已有内容for (int i=0;i<=62;i+) buffer1 i=infile.get ();/将文件中字符放入第一缓冲区for (;)str = ""cc = getChar();str += cc;AAA:if (isDelimiter(cc)/*是否是界符*/write("界符",str);else if (isOperator(cc)/*是否是操作符*/write("操作符",str);else if (isEnter(cc)/*是否是换行符

11、*/write("换行", "n");else if (isUnderline(cc) | isChar(cc)/*是否是标识符*/for (;)cc = getChar();if (!(isChar(cc) | isDigit(cc) | isUnderline(cc)write("标识符",str);str = cc;goto AAA;str += cc;else if (isDigit(cc)/*是否是数字*/for (;)cc = getChar();if (!(isDigit(cc) && cc != 

12、9;.')write("数字",str);str = cc;goto AAA;str += cc;return 0;/*/*双缓冲扫描文件*/char getChar()if (*pointer = -1) /*当前指针在缓冲区(不知是那个缓冲区)末尾*/if (pointer=buffer1+63)/*在第一buffer尾,向第二buffer读入数据*/ for (int i=0;i<=62;i+)buffer2 i=infile.get ();pointer=buffer2;return getChar();else if (pointer=buffer2

13、+63)/*在第二buffer尾,向第一buffer读入数据*/ for (int i=0;i<=62;i+)buffer1 i=infile.get ();pointer=buffer1;return getChar();else/*在不是buffer尾的位置读到了EOF,说明完成了分析*/ infile.close ();outfile.close ();ofstream out;cout<<"nnt词法分析完毕!"<<endl;system ("pause");exit (-1);return *pointer+;/*

14、是否是字母*/bool isChar(char c)if (c>='a' && c<='z') | (c>='A' && c<='Z') )return true; elsereturn false;/*是否是0-9*/bool isDigit(char c)if (c>='0' && c<='9') return true; elsereturn false;/*是否是下划线*/bool isUnderline(c

15、har c)if (c = '_')return true; elsereturn false;/*是否是换行*/bool isEnter(char c)if (c = 'n')return true; elsereturn false;/*是否是界符*/bool isDelimiter(char c)for (int i=0;i<10;i+)if (c = delimitersi)return true;return false;/*是否是运算符*/bool isOperator(char c)for (int i=0;i<5;i+)if (c =

16、 operatorsi)return true;return false;/*求一个字符串的长度*/int getLength(char *s)int len=0;for (int i=0;i+)if (si != '0')len+; elsereturn len;/*是否是标识符*/bool isIdentifier(char *s)int len = getLength(s);if (isChar(s0) | isUnderline(s0)for (int i=1;i<len;i+)if (!(isDigit(si) | isDigit(si) | isUnderli

17、ne(si)return false;return true; elsereturn false;/*是否为数字*/bool isNumber(char *s)int len = getLength(s);if (s0>=1 && s0<=9)for (int i=0;i<len;i+)if (!isDigit(si) && si!='.')return false;return true; elsereturn false;/*是否是关键字*/bool isKeyword(char *s)for (int i=0;i<keywords->length();i+)if (s = keywordsi)r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论