实验一:词法分析程序的设计与实现姓名:专业班级:学号:一、实验目的设计一个简单的词法分析器,从而进一步加深对词法分析器工作原理的理解。二.、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求根据PL/0语言文法,编制词法分析程序GETSYM完成以下功能:1)从键盘读入数据,分析出一个单词。2)返回单词种别(用整数表示),3)返回单词属性(不同的属性可以放在不同的全局变量中)。四.、实验步骤1.采用C语言,设计GETSYM,实现该算法2.编制测试程序(主函数main)。3.调试程序:输入一组单词,检查输出结果。五.、实验设计分析1.词法的正规式描述S=aA|aA=(aA|dA)}(a|d)2.变换后的正规文法S→aAS→aA→aAA→dAA→aA→d3.词法分析程序的程序代码#includestdafx.h#includeiostream#includestringusingnamespacestd;#defineMAX17charch='';stringkey[17]={const,long,float,double,void,main,if,else,then,break,int,char,include,for,while,printf,scanf};intIskey(stringc){//关键字判断inti;for(i=0;iMAX;i++){if(key[i].compare(c)==0)return1;}return0;}intIsLetter(charc){//判断是否为字母if(((c='z')&&(c='a'))||((c='Z')&&(c='A')))return1;elsereturn0;}intIsLetter1(charc){//判断是否为a~f字母if(((c='f')&&(c='a'))||((c='F')&&(c='A')))return1;elsereturn0;}intIsDigit(charc){//判断是否为数字if(c='0'&&c='9')return1;elsereturn0;}voidscan(FILE*fpin){stringarr=;while((ch=fgetc(fpin))!=EOF){arr=;if(ch==''||ch=='\t'||ch=='\n'){}elseif(IsLetter(ch)||ch=='_'){arr=arr+ch;ch=fgetc(fpin);while(IsLetter(ch)||IsDigit(ch)){if((ch='Z')&&(ch='A'))ch=ch+32;arr=arr+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);if(Iskey(arr)){coutarr\t关键字endl;}elsecoutarr\t普通标识符endl;}elseif(IsDigit(ch)){intflag=0;if(ch=='0'){arr=arr+ch;ch=fgetc(fpin);if(ch='0'&&ch='7'){while(ch='0'&&ch='7'){flag=1;arr=arr+ch;ch=fgetc(fpin);}}elseif(ch=='x'||ch=='X'){flag=2;arr=arr+ch;ch=fgetc(fpin);while(IsDigit(ch)||IsLetter1(ch)){arr=arr+ch;ch=fgetc(fpin);}}elseif(ch==''||ch==','||ch==';'){coutarr\t整数0endl;}fseek(fpin,-1L,SEEK_CUR);if(flag==1)coutarr\t八进制整数endl;elseif(flag==2)coutarr\t十六进制整数endl;}else{arr=arr+ch;ch=fgetc(fpin);while(IsDigit(ch)){arr=arr+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);coutarr\t十进制整数endl;}}elseswitch(ch){case'+':case'-':case'*':case'=':case'|':case'/':coutch\t运算符endl;break;case'(':case')':case'[':case']':case';':case'.':case',':case'{':case'}':coutch\t界符endl;break;case':':{ch=fgetc(fpin);if(ch=='=')cout:=\t运算符endl;else{cout::\t界符endl;;fseek(fpin,-1L,SEEK_CUR);}}break;case'':{ch=fgetc(fpin);if(ch=='=')cout=\t运算符endl;if(ch=='')cout\t输入控制符endl;else{cout\t运算符endl;fseek(fpin,-1L,SEEK_CUR);}}break;case'':{ch=fgetc(fpin);if(ch=='=')cout=\t运算符endl;elseif(ch=='')cout\t输出控制符endl;elseif(ch=='')cout\t运算符endl;else{cout\t运算符endl;fseek(fpin,-1L,SEEK_CUR);}}break;default:coutch\t无法识别字符endl;}}}voidmain(){charin_fn[30];FILE*fpin;cout请输入源文件名(包括路径和后缀名):;for(;;){cinin_fn;if((fpin=fopen(in_fn,r))!=NULL)break;elsecout文件路径错误!请输入源文件名(包括路径和后缀名):;}cout\n分析如下:\nendl;scan(fpin);fclose(fpin);}七.实验测试:输入数据及运行结果:inta=3;doubleb=4;intc;if(ab)c=a;elsec=b;