实验一词法分析器的实现一、实验目的设计并实现一个PL/0语言(或其它语言的子集,如C语言的子集)的词法分析程序,加深对词法分析原理的理解。二、实验原理:词法分析是从左向右扫描每行源程序的符号,拼成单词,换成统一的机内表示形式——TOKEN字,送给语法分析程序。TOKEN字是一个二元式:(单词种别码,自身值)。PL/0语言单词的种别码用整数表示,可参考教材或自行设定;单词自身值按如下规则给出:1标识符的自身值是它在符号表的入口地址。2常数的自身值是常数本身(或它的二进制数值)。3关键字和界限符的自身值为本身。三、实验步骤与要求1、要求根据状态图,设计实现词法分析器。2、编制程序,此程序应具有如下功能:1)输入:字符串(待进行词法分析的源程序),可从键盘直接输入或从文件读入输出:由(种别码,自身值)所组成的二元组序列。2)功能:a.滤空格b.识别保留字:ifthenelsewhiledo等c.识别标识符:字母(字母|数字)*d.识别整数数:0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*e.识别典型的运算符和分隔符,例如+-*/==();3)具有一定的错误处理功能。例如,能检查出程序语言的字符集以外的非法字符。3、可以使用开发工具,自行设计界面,可以自行确定一些附加功能。4、请指导教师检查程序和运行结果,评定成绩。评定级别分优秀、良好、合格、不合格。第一次验收中如果存在问题,老师指出后允许改进,改进后再重新验收。成绩以最后一次的验收为准。5、撰写并上交实验报告。必须提交实验报告,通过此环节训练实验总结与分析的能力。最后参考实验报告给出实验成绩。四、实验过程先对书上p19页的流程图做分析。先读入一串字符,存入Sourcecode数组中去,在对每一个字符做判断。设定一个i作为Sourcecode的字符指标。如果是空,则i=1,循环读取下一个,如果不为空,如果为字母和如果为数字两种方法做分别的比较。根据老师提示,对照51页的格式,做出界面上的设计,因为我用的是c++所以没有像java一样的去设计界面,只是用c自带的界面效果。测试内容为ifi=34;i:=5;If为关键字,i为标识符,:=为运算符。。。。在程序设计上因为没有用到什么复杂的算法,所以关键都在于逻辑上,逻辑设计上面想了很久,经常在括号比较多的情况下忘记加括号,或者括号的地方不正确,导致经常跳过很多关键步骤,最后得意修复。代码如下:#includestdafx.h#includestring#includestdlib.h#includestdio.husingnamespacestd;boolisLetter(charch){if((ch='A'&&ch='Z')||(ch='a'&&ch='z'))returntrue;elsereturnfalse;}boolisDigit(charch){if(ch='0'&&ch='9')returntrue;elsereturnfalse;}boolisOperators(charch){if(ch=='+'||ch=='*'||ch=='-'||ch=='/'||ch=='='||ch==':'||ch==''||ch=='')returntrue;elsereturnfalse;}boolisDelimiter(charch){if(ch==','||ch==';'||ch=='.'||ch=='('||ch==')'||ch=='['||ch==']'||ch=='{'||ch=='}'||ch=='#')returntrue;elsereturnfalse;}boolisBlank(charch){if(ch==''||ch=='\t')returntrue;elsereturnfalse;}charkey[34][10]={main,auto,short,int,long,float,double,char,struct,union,enum,typedef,const,unsigned,signed,extern,register,static,volatile,void,if,else,switch,case,for,do,while,goto,continue,break,default,sizeof,return};voidmain(){back:charSourcecode[100]=;//声明变量printf_s(请输入程序段,标识符为1,常数为2,关键字为3,运算符4,界符5\n);gets_s(Sourcecode);//读入程序段放入firstcodefor(inti=0;i100;i){chardelimiter[2]=;intj=0;//letterintl=0;//digitintk=0;//operatorsintb=0;//类型编号charnum[10]=;charword[10]=;if(isBlank(Sourcecode[i])==1){i+=1;}//去空格else{if(isLetter(Sourcecode[i])==1)//是否为字母{//是do{if(j10){word[j]=Sourcecode[i];j++;}}while(isDigit(Sourcecode[++i])==1||isLetter(Sourcecode[i])==1);inta=0;while(a34){if(strcmp(key[a],word)==0){b=3;a++;break;}else{b=1;a++;//否}}if(b==3){printf_s((3,%s)\n,word);}if(b==1){printf_s((1,%s)\n,word);}}elseif(isDigit(Sourcecode[i])==1){intc=0;while(isDigit(Sourcecode[i])){num[c]=Sourcecode[i];i+=1;c++;}printf_s((2,%s)\n,num);}elseif(isDelimiter(Sourcecode[i])==1){printf_s((5,%c)\n,Sourcecode[i]);i++;}elseif(isOperators(Sourcecode[i])==1){if(Sourcecode[i]==':'||Sourcecode[i]==''||Sourcecode[i]==''&&Sourcecode[i+1]=='='){printf_s((4,%c%c)\n,Sourcecode[i],Sourcecode[i+1]);i+=2;}else{printf_s((4,%c)\n,Sourcecode[i]);i+=1;}}}}gotoback;}