已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理实验报告实验一 词法分析程序的设计与实现指导教师: 姓名: 学号: 班级:一、实验目的基本掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1根据以下的正规式,编制正规文法,画出状态图;标识符 (|)*十进制整数 0 | (1|2|3|4|5|6|7|8|9) (0|1|2|3|4|5|6|7|8|9)*八进制整数 0 (0|1|2|3|4|5|6|7) (0|1|2|3|4|5|6|7)*十六进制整数 0 (x|X) (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符 + - * / 0x3f00 while八测试结果九,思考题1. 词法分析能否采用空格来区分单词?答:不能,因为比如abc+bcd中没有空格,但这是三个单词。2. 程序设计中哪些环节影响词法分析的效率?如何提高效率?答:整个程序都由状态转换图而来。由递归方法实现的状态转换图,影响了整个词法分析器的分析效率,可以考虑使用栈来非递归的实现词法分析。十实验心得 通过词法分析程序的实现,我理解了计算机是怎么去识别一个个单词的,或者可以说是各种命令的。这次实验使我对c语言中文件操作更加了解,了解文件指针的运行情况,还了解了编译原理中有限自动机的概念,根据状态图写程序。十一源代码#include using namespace std;#include #define ASG1#define ADD2#define SUB3#define MUL4#define DIV5#define ID6#define IF7#define THEN8#define WHILE9#define DO10#define INT811 /八进制#define INT1012 /十进制#define INT1613#define SLP14/左括号(#define SRP15/右括号)#define SEMI16/分号;#define LP17/左花括号#define RP18/右花括号#define INC19/+#define DECC20/-#define NEQ21/不等于#define EQ22/等于#define JAE23/大于等于#define JA24/大于#define JBE25/小于等于#define JB26/小于struct wordint kind;int value;int fpoint; /文件字符指针int num_token;/一个单词中的字符数量,主要是数字长度char *token;fstream file;/所要读取的文件word handle_identifier(char *ch)/处理标识符(包括关键字)struct word re;/返回值/关键字/if(strcmp(ch,if)=0) re.kind=IF;re.value=0;return re;if(strcmp(ch,then)=0)re.kind=THEN;re.value=0;return re;if(strcmp(ch,while)=0)re.kind=WHILE;re.value=0;return re;if(strcmp(ch,do)=0)re.kind=DO;re.value=0;return re;/标识符/re.kind=ID; re.value=0;return re;int convert(char ch) /将字符转换成数字int number;switch(ch)case0: number=0;break;case1: number=1;break;case2: number=2;break;case3: number=3;break;case4: number=4;break;case5: number=5;break;case6: number=6;break;case7: number=7;break;case8: number=8;break;case9: number=9;break;caseA: number=10;break;casea: number=10;break;caseB: number=11;break;caseb: number=11;break;caseC: number=12;break;casec: number=12;break;caseD: number=13;break;cased: number=13;break;caseE: number=14;break;casee: number=14;break;caseF: number=15;break;casef: number=15;break;default: number=-1;break;/非法字符转换成-1return number;word handle_number(char *ch,int TN)/处理无符号整数int i,j;int number;/对应每一位上转换后的数字int dec=0,oct=0,hex=0;/最终的数值,三种进制word re;/返回值if(TN=1)/一位数,只能是十进制number=convert(ch0);if(number=-1|number9) cout=0)&(number=7) )re.kind=INT8;re.value=number;return re;else cout=2)&(ch0!=0) )/两位位数(含)以上,十进制int *num=new intTN;for(i=0;i9) ) coutError!十进制非法; /报错for(i=0;i0;j-)numi*=10;dec+=numi;re.kind=INT10;re.value=dec;return re;else if( (TN=3)&(ch0=0)&(ch1!=x)&(ch1!=X) )/三位数(含)以上,八进制int *num=new intTN-1;for(i=1;i7) ) coutError!八进制非法; /报错for(i=1;i0;j-)numi*=8;oct+=numi;re.kind=INT8;re.value=oct;return re;else if( (TN=3)&(ch0=0)&(ch1=x)|(ch1=X) )/三位数(含)以上,十六进制int *num=new intTN-2;for(i=2;iTN;i+)number=convert(chi);numi=number;if(number=-1) coutError!十六进制非法; /报错for(i=2;i0;j-)numi*=16;hex+=numi;re.kind=INT16;re.value=hex;return re;word scan(char ch)word re;/返回值while(ch= |ch=n) /空格或回车 fpoint+; if(ch=n) fpoint+; / n包括回车和换行所以再加1 file.get(ch); num_token=0; /每次要分析一个单词的时候,都要重新对单词中的字符计数tokennum_token=ch;/单词开始的一个字符都放到存放单词的数组中tokennum_token+1=0;num_token+;if(isalpha(ch) /第一个字符是字母的单词是标识符file.get(ch);fpoint+;while(isalnum(ch)&!file.eof()/读取标识符的所有字母和数字tokennum_token=ch;tokennum_token+1=0;num_token+;file.get(ch);fpoint+;fpoint-;file.seekg(fpoint,ios:beg); /后退re=handle_identifier(token); /处理标识符return re;/返回单词信息(种别和属性值)else if(isdigit(ch)/第一个字符是数字的单词是整数file.get(ch);fpoint+;while(isalnum(ch)&!file.eof()/十六进制中包含字母x和X,所以整数单词中不一定只包含数字tokennum_token=ch; tokennum_token+1=0;num_token+;file.get(ch);fpoint+;fpoint-;file.seekg(fpoint,ios:beg); /后退re=handle_number(token,num_token); return re;elseswitch(ch)case :/赋值符号file.get(ch);fpoint+;if(ch =)/以“:”开头的单词只能是赋值符号,否则出错re.kind=ASG;re.value=0;return re;else coutError!赋值出错; /报错break;/各种运算符/case+:file.get(ch);fpoint+;if(ch=+)re.kind=INC;re.value=0;return re;elsefpoint-;file.seekg(fpoint,ios:beg); /后退re.kind=ADD;re.value=0;return re;break;case-:file.get(ch);fpoint+;if(ch=-)re.kind=DECC;re.value=0;return re;elsefpoint-;file.seekg(fpoint,ios:beg); /后退re.kind=SUB;re.value=0;return re;break;case*:re.kind=MUL;re.value=0;return re ; break;case/:re.kind=DIV;re.value=0;return re; break;case!:/不等号file.get(ch);fpoint+;if(ch=)/以“!”开头的单词只能是不等号,否则出错re.kind=NEQ;re.value=0;return re;else coutError!; /报错break;case=:/等号file.get(ch);fpoint+;if(ch=)/以“=”开头的单词只能是等号,否则出错re.kind=EQ;re.value=0;return re;else cout:file.get(ch);fpoint+;if(ch=)re.kind=JAE;re.value=0;return re;elsefpoint-;file.seekg(fpoint,ios:beg); /后退re.kind=JA;re.value=0;return re;break;case:file.get(ch);fpoint+;if(ch=)re.kind=JBE;re.value=0;return re;elsefpoint-;file.seekg(fpoint,ios:beg); /后退re.kind=JB;re.value=0;return re;break;case(:re.kind=SLP;re.value=0;return re; break;case):re.kind=SRP;re.value=0;return re; break;case:re.kind=LP;re.value=0;return re; break;case:re.kind=RP;re.value=0;return re; break;case;:re.kind=SEMI;re.value=0;return re; break;/不是该语言所能识别的单词/default: coutError!; /报错/end switch/主程序/void main() char ch;word reword; /接收词法分析程序返回的单词fpoint=0; /记录当前字符的位置,用于回退num_token=0;/记录一个单词中的字符数量token=new char30;/存放每个单词file.open(word.txt);coutn词法程序分析结果:endl;while(1)file.get(ch);fpoint+;if(file.eof()!=0) break;reword=scan(ch);if(reword.kind!=0)switch(reword.kind) case 1: cout ASG ;break; case 2: cout ADD ;break; case 3: cout SUB ;break; case 4: cout MUL ;break; case 5: cout DIV ;break; case 6: cout ID ;break; case 7: cout IF ;break; case 8: cout THEN ;break; case 9: cout WHILE ;break; case 10: cout DO ;break; case 11: cout INT8 ;break; case
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医学研究员招聘面试题库及参考答案
- 2025年资深运维工程师招聘面试题库及参考答案
- 消防员证考试题库及答案
- 消防考试题库及答案初级
- 初级会计单选题库及答案
- 2025年策略咨询师招聘面试参考题库及答案
- 2025年影视制作助理招聘面试题库及参考答案
- 2025年统计分析员人员招聘面试参考题库及答案
- 铁路货运安全题库及答案
- 2025年创新研究员招聘面试参考题库及答案
- 支扩伴感染的护理查房
- 2025年工会专业知识考试题库及答案(真题版)
- 单位票据管理办法
- 【2025年】浙江省湖州市【辅警协警】笔试真题含答案
- 图木舒克市供热管理办法
- 安全生产标准化全套档案
- 景区厕所安全管理制度
- 脑卒中康复治疗教案
- 2025徐州生物工程职业技术学院辅导员考试试题及答案
- 2025年上海市松江区高考英语一模试卷
- 采购交期管理指导手册
评论
0/150
提交评论