编译原理实验(词法分析)_第1页
编译原理实验(词法分析)_第2页
编译原理实验(词法分析)_第3页
编译原理实验(词法分析)_第4页
编译原理实验(词法分析)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

PAGE2PAGE2编译原理实验报告实验一实验题目:词法分析指导老师:任姚鹏专业班级:计算机科学与技术系网络工程方向1002班姓名:xxxx2013年4月13日实验类型__验证性__实验室_软件实验室三__一、实验项目的目的和任务:了解和掌握词法分析的方法,编程实现给定源语言程序的词法分析器,并利用该分析器扫描源语言程序的字符串,按照给定的词法规则,识别出单词符号作为输出,发现其中的词法错误。二、实验内容:1.设计一个简单的程序设计语言(语言中有若干运算符和分界符;有若干关健字;若干标识符及若干常数)2.确定编译中使用的表格、词法分析器的输出形式、标识符与关键字的区分方法。3.把词法分析器设计成一个独立的过程。三、实验要求:1.从键盘上输入源程序;2.处理各单词,计算个单词的值和类型;3.输出个单词名、单词的值和类型。四、实验代码#include<stdio.h>#include<string.h>charfile[1024];intlength=0;intindex; charkeywords[][10]={"auto","short","int","long","float", "double","char","struct","union","enum", "typedef","const","unsigned","signed","extern", "register","static","volatile","void","default", "if","else","switch","case","for", "do","while","goto","continue","break", "sizeof","return"};charlimits[]={'(',')','[',']','{','}',',',';'}; charoperators[]={'+','-','*','/','%', '>','<','&','|','^', '~','!','='}; //13intIsChar(charch) //是否是字符{ if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) return1; return0;}intIsNumber(charch) { if((ch>='0'&&ch<='9')) return1; return0;}intIsKeyWord(intidx) //关键字和标示符识别{ chartmp[30]; inti=0; while(IsChar(file[idx]))tmp[i++]=file[idx++]; //将单词拷贝 tmp[i]='\0'; if(i==0) return0; for(i=0;i<32;i++) { if(0==strcmp(keywords[i],tmp)) //相等 { printf("(关键字%d,%s)\n",1,tmp); //打印结果,关键字 index=idx-1; //新的index的值 return1; } } return0;}intIsConst(intidx) { chartmp[30]; inti=0; if(IsChar(file[idx])&&(file[idx-1]=='\'')) //单个字符判断{ if(file[idx+1]=='\'') //是单个的字符 {tmp[i++]=file[idx++]; tmp[i]='\0'; printf("(常数%d,%s)\n",3,tmp);//打印结果 index=idx-1; return1;} else {return0;}} elseif(IsNumber(file[idx])) //一串数字判断 {while(IsNumber(file[idx])) tmp[i++]=file[idx++]; tmp[i++]=file[idx++]; tmp[i]='\0'; printf("(常数%d,%s)\n",3,tmp);//打印结果 index=idx-1; return1;} return0;}intIsWord(intidx) //是否是标示符{ chartmp[30]; inti=0; if(IsKeyWord(idx))//是关键字就不做处理 return0; if(IsConst(idx)) //是常量不做处理 return0; if((file[idx]=='_')||(IsNumber(file[idx]))||(IsChar(file[idx]))) tmp[i++]=file[idx++]; if(i==0)return0; while((IsNumber(file[idx]))||(IsChar(file[idx]))) tmp[i++]=file[idx++]; //将单词拷贝 tmp[i]='\0'; printf("(标示符%d,%s)\n",2,tmp); //打印结果 index=idx-1; return1;}intIsOperator(intidx) //是否是运算符 {chartmp[30]; intk=0; inti=0; for(k=0;k<13;k++){if(operators[k]==file[idx]) { tmp[i++]=file[idx]; index=idx; if((file[idx+1]=='=')|| ((file[idx]=='+')&&(file[idx+1]=='+'))|| ((file[idx]=='-')&&(file[idx+1]=='-'))) { tmp[i++]=file[++idx]; index=idx; } tmp[i]='\0'; printf("(运算符%d,%s)\n",4,tmp); //打印结果 return1;}} return1;}intIsLimit(intidx) //限界符{ inti; for(i=0;i<8;i++) { if(limits[i]==file[idx]) { printf("(界限符%d,%c)\n",4,file[idx]); return1;}} return0;}intReadFile(char*name){ inti=0; intlength; charch; FILE*fp=fopen(name,"r"); if(fp==NULL) { printf("can'topenfile%s\n",name); return-1;} length=0; while((ch=fgetc(fp))!=EOF) file[length++]=ch; for(i=0;i<length;i++) putchar(file[i]); fclose(fp); returnlength;}intmain(){ if((length=ReadFile("TestDemo.c"))==-1) //读取文件失败 return-1; index=0; while(index<length) { while((file[index]=='')&&(index<length))index++; //去除空格 if(index>=length)return0; if(IsKeyWord(index)) //考查是不是关键字 {} elseif(IsConst(index)) {} elseif(IsWord(index)) //考查是不是符号 {} elseif(IsLimit(index)) {} elseif(IsOperator(index)) {} index++; //考查下一个字符} return0;}五、运行结果六、实验总结实验一是关于词法分析

温馨提示

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

评论

0/150

提交评论