1、词法分析器文档词法分析器说明书华南理工大学广州汽车学院2007级计算机1班邹明汕、严嘉健词法分析器是通过编写程序,对字符集进行识别。字符集包括保留字,标识符,整数,字符常数和符号(双界符,单界符)。每次遇到相应的单词时输出单词的种别码,如果单词不在单词表的范围内则输出报错信息。另外如果双界符不是成对出现程序也可测出错误并报错。词法分析器功能:识别指定路径下的文本文档中的内容,并输出单词的种别码,对超出范围的单词报错,对不成对的双界符,【】报错,对错误标识符报错,如:1a。关键代码分析:程序代码主要分为三个模块1、 模块一主函数模块功能:对规定路径下的文本文档中的内容进行断句,然后录入数组操作。
2、首先用i=f.get()从文件中取出一个字符并赋值给i,i为该字符的ASC值,为整数。并将i存入一个足够大的数组中an=i;用while()函数循环此操作,遇到空格或换行或文件结束符或符号时,添加自定义的结束标示符127,然后调用字符集识别函数scan(int a ),在确定调用scan(int a )之前还要数组中存放的单词是否是否是符号,如果是符号,需要判别该符号是否是双界符,否则程序会将双界符分开两次传送造成识别错误。该模块还对双界符,【】是否成对出现进行判断,当遇到左符号是计数器t加1,遇到有符号时计数器t减1。如果最后t不为0时报错。2、 模块二识别函数模块scan(int a )功
3、能:根据单词编码表判别单词的种别码该函数模块分为六小部分,分别用标志符flag区分,把单词表中的保留字字符存放在指针数组char*p35中,符号存放在指针数组char*q22中,作为比较的标准。flag0为保留字判断,代码会通过for循环对单词的逐个字符和指针数组char*p35中的保留字进行比较,判断单词是否为保留字。如果不是则自动进入flag1中判断单词是否为整数,整数的ASC值范围是48到57。如果不是则自动进入flag2中判断单词是否为标识符,标识符的ASC值范围是65到90和97到122。如果不是则进入flag3中判断单词是否为字符常数,字符常数判断的重要标准:单词前后是否含有单引号
4、。单引号的ASC值是39,如果不是进入flag4中判断单词是否为符号,代码会通过for循环对单词的逐个字符和指针数组char*q22中的符号进行比较,判断单词是否为符号。如果不是程序则自动进入flag10,并调用输出函数show()报错。3、 模块三输出函数show(int k,int a,int flag)功能:按照样板的输出标准,输出单词的种别码,如果有错误则报错。根据flag标志位进行输出,当flag为0和4时输出标准为当flag为1、2、3时输出标准为,把文件中的标识符,整数,字符常数不重复的放入一个足够大的数组中,每次放入前比较数组中是否含有相同的单词,如果没有则添加进数组,并输出该
5、单词在数组中的位置n,反之,输出数组中和该单词相同单词的位置n,n是单词在数组中的序号,按照比较顺序排放。当flag为10是输出报错信息附录:#include#include#includeint s=0;int q100;void show(int k,int a,int flag) s+; int i,j,f1,f2=0,h,t=1; if(flag=0|flag=4) cout(k,-) ; if(flag=1|flag=2|flag=3) cout(k,; for(i=0,h=0;i100;i+,h+) if(f2=1) h=0;f2=0; if(q0=NULL) for(i=0;i1
6、00;i+) qi=ai; if(ai=127) i=0; break; coutt; break; if(ah=127) coutt; break; if(qi!=ah) for(j=i;j100;j+) if(qj=127) if(qj+1=NULL) for(j=j+1,h=0;j100;j+,h+) qj=ah; if(ah=127) coutt+1; f1=1; break; i=j; t+; f2=1; break; if(f1=1) f1=0;break; cout) ; if(flag=10) cout(error) ; if(s%5=0) coutendl; void sca
7、n(int a)int n,flag,k,r; char *q22=(,),*,*/,+,-,.,.,/,/*, :,:=,;,=,=,=,; char*p35= and,array,begin,bool,call,case,char,constant, dim,do,else,end,false,for,if,input,integer,not, of,or,output,procedure,program,read,real,repeat, set,stop,then,to,true,until,var,while,write ; if(a0=48&a0=65&an=97&an=122)
8、flag=10; k=0; show(k,a,flag); return; flag=0; if(flag=0) for(k=0;k35;k+) n=0; while(*(pk+n)!=NULL) if(an!=int(*(pk+n) break; if(*(pk+n+1)=NULL&an+1=127) show(k+1,a,flag); return; n+; flag=1; if(flag=1) n=0; while(an!=127) if(an57) break; n+; if(an=127) k=37; show(k,a,flag); return; flag=2; if(flag=2
9、) n=0; while(an!=127) if(an=65&an=97&an=48&an=57) n+; else break; if(an=127) k=36; show(k,a,flag); return; r=0; flag=3; if(flag=3) n=0; while(an!=127) if(an=39) r+; n+; if(an!=123&an!=125) n+; else flag=10;show(k,a,flag); if(an=39) r-; k=38; show(k,a,flag); return; if(r!=0) flag=10; show(k,a,flag);
10、return ; flag=4; if(flag=4) for(k=0;k=40&i=58&i=40&i=58&i=62|i=91|i=93) if(i=42) t4+; n=0; else if(i=47) t4-; n=0; i=32; else an=i; n+; an=127; scan(a); n=0; i=f.get(); else an=127; scan(a); n=0; if(i!=32&i!=10&t4=0) an=i; n+; if(t1!=0) cout错误:缺少(或)endl; if(t2!=0) cout错误:缺少或endl; if(t3%2!=0) cout错误:
11、缺少endl; if(t4!=0) cout错误:缺少/*或*/endl; f.close(); 单词表:单 词种别码单 词种别码单 词种别码and1output21*41array2procedure22*/42begin3program23+43bool4read24,44call5real25-45case6repeat26.46char7set27.47constant8stop28/48dim9then29/*49do10to30:50else11true31:=51end12until32;52false13var3353for14whilr34=54if15write3555input16标识符36=56integer17整数3757not18字符常数38=58of19(3959or20)4060
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1