实验一词法分析器_第1页
实验一词法分析器_第2页
实验一词法分析器_第3页
实验一词法分析器_第4页
实验一词法分析器_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

词法剖析器实验报告一、实验目的及要求本次实验经过用C语言设计、编制、调试一个词法剖析子程序,辨别单词,实现一个C语言词法剖析器,经过此过程能够加深对编译器分析单词流的过程的认识。运转环境:硬件:windowsxp软件:visualc++二、实验步骤查问资料,认识词法剖析器的工作过程与原理。剖析题目,整理出基本设计思路。实践编码,将设计思想变换用c语言编码实现,编译运转。测试功能,多次设置包含不一样字符,重点字的待分析文件,认真察看运转结果,检测该剖析器的剖析结果能否正确。经过最后的测试发现问题,渐渐完美代码中设置的剖析对象与重点字表,拓宽剖析范围提升剖析能力。三、实验内容本实验中将c语言单词符号分红了四类:重点字key(特其余将main说明为主函数)、一般标示符、常数和界符。将重点字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法剖析过程中,重点字表和case列出的界符的内容是固定不变的(由程序中的初始化确立),所以,从源文件字符串中辨别出现的重点字,界符只好从此中选用。表记符、常数是在剖析过程中不停形成的。关于一个详细源程序而言,在扫描字符串时辨别出一个单词,若这个单词的种类是重点字、一般标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法剖析程序,它均能自动持续扫描下去,形成下一个单词,直到整个源程序所有扫描完成,进而形成相应的单词串。输出形式比如:void$重点字流程图、程序流程图:开始输入源文件路径路径能否有效是翻开源文件初始化文件指针辨别指针内容文件结束?否是空格,空白或换行吗是跳过该字符指向下一字符回退输出word为一般标示符

否是否是字母吗是将字符加入字符数组Word[]指向下一字符是字母惑数字吗否将word与重点字表key进行匹配否般配?是输出word为重点字

结束否是数字吗否是界符吗是将字符加入字符数将字符组Word[]加入字符数组是Word[]指向下一字符是辨别指针内容输出word为界符是数字吗否输出word指向下一字符为常数

将字符加入字符数否组Word[]将字符加入字符数组Word[]输出Word内容为不可辨别程序:#include<>#include<>#include<>#include<>//定义重点字char*Key[10]={"main","void","int","char","printf","scanf","else","if","return"};charWord[20],ch;

//

储存辨别出的单词流intIsAlpha(charc){//判断能否为字母if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))return1;elsereturn0;}intIsNum(charc){//if(c>='0'&&c<='9')return1;elsereturn0;

判断能否为数字}intIsKey(char*Word){

//

辨别重点字函数intm,i;for(i=0;i<9;i++){if((m=strcmp(Word,Key[i]))==0){if(i==0)return2;return1;}}return0;}voidscanner(FILE*fp){charWord[20]={'\0'};charch;inti,c;ch=fgetc(fp);//if(IsAlpha(ch)){Word[0]=ch;ch=fgetc(fp);

////

扫描函数获得字符,指针fp并自动指向下一个字符判断该字符是不是字母i=1;while(IsNum(ch)||IsAlpha(ch)){//判断该字符是不是字母或数字Word[i]=ch;i++;ch=fgetc(fp);}Word[i]='\0';//'\0'fseek(fp,-1,1);c=IsKey(Word);if(c==0)printf("%s\t$elseif(c==2)printf("%s\t$elseprintf("%s\t$

代表字符结束(空格)////一般表记符\n\n",Word);//主函数\n\n",Word);重点字\n\n",Word);//

回退一个字符判断是不是重点字不是重点字输出重点字}else

//if(IsNum(ch)){

//

开始判断的字符不是字母判断是不是数字Word[0]=ch;ch=fgetc(fp);i=1;while(IsNum(ch)){Word[i]=ch;i++;ch=fgetc(fp);}Word[i]='\0';fseek(fp,-1,1);//回退printf("%s\t$无符号实数\n\n",Word);}else//开始判断的字符不是字母也不是数字{Word[0]=ch;switch(ch){case'[':case']':case'(':case')':case'{':case'}':case',':case'"':case';':printf("%s\t$界符\n\n",Word);break;case'+':ch=fgetc(fp);Word[1]=ch;if(ch=='='){printf("%s\t$运算符\n\n",Word);//运算符“+=”}elseif(ch=='+'){printf("%s\t$运算符\n\n",Word);//判断结果为“++”}else{fseek(fp,-1,1);printf("%s\t$运算符\n\n",Word);//判断结果为“+”}break;case'-':ch=fgetc(fp);Word[1]=ch;if(ch=='='){printf("%s\t$运算符\n\n",Word);}elseif(ch=='-'){printf("%s\t$运算符\n\n",Word);//判断结果为“--”}else{fseek(fp,-1,1);printf("%s\t$运算符\n\n",Word);//判断结果为“-”}break;case'*':case'/':case'!':case'=':ch=fgetc(fp);if(ch=='='){printf("%s\t$运算符\n\n",Word);}else{fseek(fp,-1,1);printf("%s\t$

运算符

\n\n",Word);}break;case'<':ch=fgetc(fp);Word[1]=ch;if(ch=='='){printf("%s\t$

运算符

\n\n",Word);//

判断结果为运算符“<=”}elseif(ch=='<'){printf("%s\t$运算符\n\n",Word);//判断结果为“<<”}else{fseek(fp,-1,1);printf("%s\t$

运算符

\n\n",Word);//

判断结果为“

<”}break;case'>':ch=fgetc(fp);Word[1]=ch;if(ch=='=')printf("%s\t$运算符\n\n",Word);else{fseek(fp,-1,1);printf("%s\t$运算符\n\n",Word);}break;case'%':ch=fgetc(fp);Word[1]=ch;if(ch=='='){printf("%s\t$if(IsAlpha(ch))printf("%s\t$else{fseek(fp,-1,1);printf("%s\t$取余运算符

运算符\n\n",Word);}种类表记符\n\n",Word);\n\n",Word);}break;default:printf("

没法辨别字符

!\n\n");break;}}}main(){charin_fn[30];

//

文件路径FILE*fp;printf("\n

请输入源文件名(包含路径和后缀名)

:");while(1){gets(in_fn);//scanf("%s",in_fn);if((fp=fopen(in_fn,"r"))!=NULL)break;//

读取文件内容,并返回文件指针,该指针指向文件的第一个字符elseprintf("文件路径错误

!请从头输入

:");}printf("\n*******************

词法剖析结果以下

*******************\n");do{ch=fgetc(fp);if(ch=='#')break;//elseif(ch==''||ch=='\t'||ch=='\n'){}//

文件以#结尾,作为扫描结束条件忽视空格,空白,和换行else{fseek(fp,-1,1);//回退一个字节开始辨别单词流scanner(fp);}}while(ch!='#');return(0);}实验结果分析源文件:voidmain(){inta=3;a+=b;printf("%d",a);return;}#分析结果:实验总结剖析经过本次实验,让再次阅读了相关c语言的一些基本知识,特别是对文件,字符串进行基本操作的方法。C语言中没有string种类,所以本实验中的对字符串提取与辨别均借助#include<>及字符型数组来实现。让我练习对字符串函数应用的同时也提升了自己的逻辑思维能力。在本次实验中,我纠正了一个向来以来的观点错误:main不是重点字,它定义为程序的进口,是主函数!在本实验中,固然我把main初始化在重点字表(字符指

温馨提示

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

评论

0/150

提交评论