资源描述:
《编译原理-词法分析程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、//madefromdragon//examplel.cpp:Definestheentrypointfortheconsoleapplication.//(1)将单词分为标识符、常数、保留字和分隔符。//(2)事先建立一保留字表,以备在识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。〃(3)所输岀的每一单词,均按形如(CLASS,VALUE)的二元式编码。〃(4)输出保留字表3、标识符表1、常量表2、分隔符用4//表示对源程序修改过的部分////////〃分析程序source.txt要新建/
2、/PROGRAMSOURCE;//{thislittlesourceprogramisusedtoillustratecompilingprocedure.}//VARx,y,z:integer;//a:integer;//BEGIN//2ab//%%#//x:=23+5;//z:=xDIV-3b;//y:=z+18*3;//a:=x+(y-2)DIV4;//IFa>bTHENs:=s+l;//ELSEs:=s-l;//WHILEx>0DO//y:=y+l;//END.#includeu
3、singnamespacestd;#include#include#include#include#defineID1〃标识符#defineINT2〃常量#defineSAVED3〃保留字#defineFENGE4〃分隔符char*s[11[={“PROGRAM",”VAR“,”BEGIN”,“DIV“,“END”,“INTEGER”,“WHILE”,”DO”,”IF”,“THEN“,“ELSE”};//charTORE叫20];c
4、harVAR[40][40];//标识符存放在该数组里charINTERG120J120];//常量存放在该数组里charKEY[20][20];//保留字存放在该数组里intj=O;//intk=0;//intt=0;//intlookup(char*b);voidout(inta,char*b);voidreport_error(intn);voidscanner_example(FILE*fp){staticintline=l;charch;inti=();intc;inta=0;ch=fgetc(f
5、p);if(isalpha(ch))//判断字符ch是否为英文字母{TOKEN[0]=ch;ch=fgetc(fp);i=l;while(isalnum(ch))//是否为英文字母{TOKEN[i]二ch;〃读取一个字符i++;ch=fgetc(fp);}TOKENJiW;fseek(fp,-1,1);//重定位流(数据流/文件)上的文件内部位置指针fseek重定位流(数据流/文件)上的文件内部位置指针注意:不是定位文件指针,文件指针指向文件/流。位置指针指向文件内部的字节位置,随着文件的读収会移动,文件指
6、针如果不重新赋值将不会改变指向别的文件。c=lookup(strupr(TOKEN));//转成大写if(c==0)//如果不是关键字{out(ID,TOKEN);strcpy(VARrjl,TOKEN);//j++;1else//如果是关键字out(SAVED,TOKEN);strcpy(KEY[k],TOKEN);//k++;}}else{if(isdigit(ch))//是否是数字isdigit功能:判断字符c是否为数字说明:当为数字0・9时,返回非零值,否则返回零。{TOKEN[0]=ch;ch=f
7、getc(fp);i=l;while(isdigit(ch)
8、
9、isalpha(ch)){if(isalpha(ch)){a=l;}TOKEN[i]=ch;i++;ch=fgetc(fp);}TOKEN[i]=' ';fseek(fp,・l,l);if(a==l){report_error(line);cout«n数字开头的标识符:”;cout«TOKEN«endl;a=0;}else}out(INT,TOKEN);strcpy(INTERG[t],TOKEN);//t++;〃}}else//既不是数字也
10、不是英文字母switch(ch)caseVch=fgetc(fp);if(ch=='-)out(FENGE,U<=H);elseif(ch==*>,)out(FENGE,”v>“);else{fseek(fp,-l,l);out(FENGE,U=n);else{fs