南华大学计算机科学与技术学院实验报告(2008~2009学年度第一学期)课程名称编译原理实验名称语法分析器姓名张博学号20064440218专业计算机专业班级计算机062班地点八栋209教师陈星南华大学计算机科学与技术学院实验报告1.实验目的及要求软件、硬件环境MicrosoftVisualc++6.0.实验目的:编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。实验要求:利用C语言编制递归下降分析程序,并对简单语言进行语法分析。(1)待分析的简单语言的语法:用扩充的BNF表示如下:程序::=begin语言串end语言串::=语句{;语句}语句::=赋值语句赋值语句::=ID:=表达式表达式::=项{+项|-项}项::=因子{*因子|/因子}因子::=ID|NUM|(表达式)(2)实验要求说明:输入单词串,以”#”结束,如果是正确的文法句子,则输出成功信息,打印“success”,否则输出“error”。2.实验算法思想(包含主程序的示意图)(1)主程序的示意图如下图所示:(2)递归下降分析程序示意图如下图所示:南华大学计算机科学与技术学院实验报告(3)语法串分析过程示意图如下图所示:南华大学计算机科学与技术学院实验报告(4)statement语句分析函数示意图如下图所示:(5)expression表达式分析函数如下图所示:南华大学计算机科学与技术学院实验报告(6)term分析函数示意图如下图所示:(7)factor分析过程示意图如下图所示:3.实验内容#includestdio.h#includeiostream.h#includestring.h#defineMAX150//词法分析表的最大容量#defineMAXBUF255//缓冲区的最大缓冲量voidterm();voidlrparser();南华大学计算机科学与技术学院实验报告voidstatement();voidyucu();voidexpression();voidfactor();charprog[MAXBUF],token[MAX];charch;intsyn,p,m,n,sum,kk;char*rwtab[6]={begin,if,then,while,do,end};/////////////////////////////////////////////////词法分析程序///////////////////////////////////////////////voidscaner(){for(m=0;mMAX;m++)token[m]=NULL;m=0;sum=0;ch=prog[p++];while(ch=='')ch=prog[p++];//读取下一个字符;if(ch=65&&ch=122/*是字母字符*/){while(ch=65&&ch=122||ch=48&&ch=57)/*为字母字符或数字字符*/{token[m++]=ch;ch=prog[p++];//读取下一个字符;}token[m++]='\0';p=p-1;syn=10;for(n=0;n6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;//给出syn值;break;}}elseif(ch=48&&ch=57/*ch为数字字符*/){while(ch=48&&ch=57/*ch为数字字符*/){sum=sum*10+ch-'0';ch=prog[p++];//读取下一个字符;}p=p-1;//回退一个字符;syn=11;}elseswitch(ch){case'':m=0;token[m++]=ch;ch=prog[p++];//读取下一个字符;if(ch==''){syn=21;token[m++]=ch;}elseif(ch=='=')南华大学计算机科学与技术学院实验报告{syn=22;token[m++]=ch;}else{syn=20;p=p-1;//回退一个字符;}break;case'':token[m++]=ch;;ch=prog[p++];//读取下一个字符;if(ch=='='){syn=24;//将=的中别码=syn;token[m++]=ch;;}else{syn=23;p=p-1;//回退一个字符;}break;case':':token[m++]=ch;;ch=prog[p++];//读取下一个字符;if(ch=='='){syn=18;token[m++]=ch;;}else{syn=17;p=p-1;//回退一个字符;}break;case'+':syn=13;token[0]=ch;break;case'-':syn=14;token[0]=ch;break;case'*':syn=15;token[0]=ch;break;case'/':syn=16;token[0]=ch;break;case'=':syn=25;token[0]=ch;break;case';':syn=26;token[0]=ch;break;case'(':syn=27;token[0]=ch;break;case')':syn=28;token[0]=ch;break;case'#':syn=0;token[0]=ch;break;default:syn=-1;break;}}南华大学计算机科学与技术学院实验报告///////////////////////////////////////////////////////////////voidstatement(){if(syn==10){scaner();//读下一个单词符号;if(syn==18){scaner();//读下一个单词符号;expression();//调用expression函数;}else{cout赋值符号错误!endl;kk=1;}}else{cout语句错误!endl;kk=1;}return;}///////////////////////////////////////////////////////////////voidyucu(){statement();//调用statement();while(syn==26){scaner();//读下一个单词符号;statement();//调用statement()函数;}return;}//////////////////////////////////////////////////////////////////////voidexpression(){term();//调用term函数;while(syn==13||syn==14){scaner();//读下一个单词符号;term();//调用term函数}return;}//////////////////////////////////////////////voidterm(){factor();//调用factor函数;while(syn==15||syn==16){scaner();//读下一个单词符号;factor();//调用factor函数;}return;}南华大学计算机科学与技术学院实验报告///////////////////////////////////////////voidfactor(){if(syn==10||syn==11)scaner();//读下一个单词符号;elseif(syn==27){scaner();//读下一个单词符号;expression();//调用expression()函数;if(syn==28)scaner();//读下一个单词符号;else{cout输出')'错误endl;kk=1;}}else{cout输出表达示错误endl;kk=1;}return;}///////////////////////////////////////////voidlrparser(){scaner();//读下一个单词符号;if(syn==1){scaner();//读下一个单词符号;yucu();//调用yucu函数;if(syn==6){scaner();//读下一个单词符号;if(syn==0&&(kk==0))coutSuccessendl;}else{if(kk!=1)cout缺end'错误!endl;kk=1;}}else{coutbegin错误!endl;kk=1;}return;}//主函数///////////////////////////////////////////voidmain(){charA;cout*****************************************endl;南华大学计算机科学与技术学院实验报告cout欢迎使用语法分析程序endl;loop:p=0;cout*****************************************endl;printf(pleaseinputstring(以#结束):\n);do{scanf(%c,&ch);prog[p++]=ch;//输入源程序字符串,送到缓冲区prog[p++]中;}while(ch!='#');p=0;lrparser();cout*****************************************endl;cout请确定是否继续输入:Y为继续;其它为退出;endl;cout是否继续:;cinA;switch(A){case'Y':gotoloop;default:cout*****************************************endl;coutThankyou!ByeBye!endl;cout*****************************************endl;break;}}4.实验结果例如:对源程序beginx:=9;x:=2*3;b:=a+xend#经语法分析后输出success.输入:x:=a+b*cend#输出:error(给出错误的原因).南华大学计算机科学与技术学院实验报告5.实验总结分析这次实验是进行初步的语法分析,是基于上次词法分析器的基础上建立起来的分析程序。此次实验比较简单,只须把词法分析器的程序放进来,然后再进行函数调用即可。通过此次实验,我基本上了解了语法分析器的工作原理和功能以及实现方法。进一步学习了C语言的知识。此次实验,要解决的问题便是分析语法程序,如果正确则输出正确,如果错误,分析它的错误并给出结果,实现了实验的要求内容。因而,本程序算是一个比较成功的程序。