您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > C++源代码单词扫描程序
院系:计算机学院实验课程:编译原理实验实验项目:C++源代码单词扫描程序(词法分析)指导老师:黄煜廉一.实验项目C++源代码单词扫描程序(词法分析)二.实验要求1.C++源代码扫描程序识别C++记号。C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。2.打开一个C++源文件,打印出所有以上的记号。3.要求应用程序应为Windows界面。4.选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。因此,程序中还应该有这样的压缩功能。5.选作部分:进一步思考或实现——如何进一步实现减小源文件大小的压缩功能。6.应该书写完善的软件文档。三.需求分析1.根据所需的功能程序应分为分析关键字、分析标识符、分析数字、分析串、分析注释、分析特殊字符和过滤多余字符几部分。2.关键字有iostream.h.main.while.gotoincludeforbreakcaseifstructclass等。3.过滤字符要考虑到空格和换行。四.实验代码五.#includeiostream.h六.#includestdio.h七.#includestring.h八.#includectype.h九.#includeconio.h十.FILE*fp;十一.charstring(charc[]);//字符串处理十二.charch;十三.char*operate[6]={+,-,*,/,++,--};十四.char*note[4]={//,/*,*/,\};十五.char*symbol[31]={%,$,^,&,_,#,,=,=,,=,,,==,!=,&&,||,!,十六.,,;,:=,.,(,),{,},&&,||,!,(),};十七.char*keyword[35]={iostream.h,include,break,case,char,const,continue,default,do,double,十八.else,enum,cin,float,for,goto,if,int,long,cout,十九.return,short,signed,sizeof,static,struct,switch,typedef,printf,二十.union,unsigned,void,volatile,while,main};二十一.二十二.intsearch(charsearchstr[],inttype)//符号匹配查找二十三.{二十四.inti;二十五.switch(type)二十六.{二十七.case1:for(i=0;i35;i++)二十八.{二十九.if(strcmp(keyword[i],searchstr)==0)三十.return1;三十一.三十二.}三十三.case2:三十四.{三十五.for(i=0;i=5;i++)三十六.{三十七.if(strcmp(operate[i],searchstr)==0)三十八.return1;三十九.}四十.break;四十一.}四十二.case3:for(i=0;i31;i++)四十三.{四十四.if(strcmp(symbol[i],searchstr)==0)四十五.return1;四十六.}break;四十七.case4:for(i=0;i=3;i++)四十八.{四十九.五十.if(!strcmp(note[i],searchstr)&&i==3)五十一.{五十二.string(searchstr);五十三.break;五十四.}五十五.elseif(!strcmp(note[i],searchstr))五十六.return1;五十七.五十八.}break;五十九.}六十.return0;六十一.}六十二.六十三.charletter(charch)//字母处理六十四.{六十五.inti=-1;六十六.charletter[50];六十七.while(isalnum(ch)||ch=='.')六十八.{六十九.letter[++i]=ch;七十.ch=fgetc(fp);七十一.}七十二.letter[i+1]='\0';七十三.if(search(letter,1))七十四.{七十五.coutletter关键字endl;七十六.}七十七.else七十八.{七十九.coutletter标识符endl;八十.}八十一.return(ch);八十二.}八十三.八十四.八十五.charnumber(charch)//数字处理八十六.{八十七.inti=-1;八十八.charnum[20];八十九.while(isdigit(ch)!=0)九十.{九十一.num[++i]=ch;九十二.ch=fgetc(fp);九十三.}九十四.if(isalpha(ch)!=0)九十五.{九十六.while(!isspace(ch))九十七.{九十八.num[++i]=ch;九十九.ch=fgetc(fp);一○○.}一○一.num[i+1]='\0';一○二.coutnum错误!endl;一○三.gotoloop;一○四.}一○五.num[i+1]='\0';一○六.coutnum数字endl;一○七.loop:return(ch);一○八.}一○九.一一○.一一一.charother(charch)一一二.{一一三.inti=-1;一一四.charother[1000];一一五.if(isspace(ch))//是空格一一六.{一一七.ch=fgetc(fp);一一八.gotoloop;一一九.}一二○.while((!isspace(ch))&&(!isalnum(ch)))//不是空格且不是字母或数字一二一.{一二二.other[++i]=ch;一二三.ch=fgetc(fp);//若是字母,不是空格的判断没有写出来一二四.}一二五.other[i+1]='\0';一二六.if(search(other,2))一二七.coutother算数运算符endl;一二八.else一二九.if(search(other,3))一三○.coutother特殊符号endl;一三一.else一三二.if(search(other,4))一三三.coutother注释符endl;一三四.loop:return(ch);一三五.}一三六.charstring(charc[])//字符串一三七.{一三八.inti=0;一三九.//charch;一四○.charstri[100];一四一.stri[i]=c[0];一四二.ch=fgetc(fp);一四三.while(ch!='')一四四.{一四五.stri[++i]=ch;一四六.ch=fgetc(fp);一四七.}一四八.stri[++i]=ch;一四九.stri[++i]='\0';一五○.coutstri字符串endl;一五一.return(ch);一五二.}一五三.intmain()一五四.{一五五.charstr,c;一五六.coutPleaseenterafilename:;一五七.charFileName[100];一五八.cinFileName;一五九.fp=fopen(FileName,r);一六○.一六一.一六二.if(fp==NULL)一六三.{一六四.coutUnabletoopenfile!endl;一六五.return0;一六六.}一六七.else一六八.{一六九.coutOpenthefilesuccessfully!endl;一七○.coutfpendl;一七一.str=fgetc(fp);一七二.while(str!=EOF)一七三.{一七四.if(isalpha(str))一七五.str=letter(str);一七六.else一七七.{一七八.if(isdigit(str))一七九.str=number(str);一八○.else一八一.str=other(str);一八二.}一八三.}一八四.coutendlendl;一八五.一八六.}一八七.c=getch();一八八.return0;一八九.}一九○.运行结果1.成功运行2.未找到文件时一九一.参考文献《编译原理及实践》《C++程序设计》
本文标题:C++源代码单词扫描程序
链接地址:https://www.777doc.com/doc-7099325 .html