湖北第二师范学院计算机学院,计科三班,郝耀峰1250312025,编译原理实验报告.指导老师:张绪辉,语法分析实验报告此次实验的目的是:编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。要求:利用C语言编制递归下降分析程序,并对简单语言进行语法分析。实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。例如:输入begina:=9;x:=2*3;b:=a+xend#输出语法分析成功输入x:=a+b*cend#输出语法分析三、语法分析程序的C语言程序源代码#includestdio.h#includestdlib.h#includestring.hcharprog[100],ch,token[8];intp=0,syn,n,i;char*keyword[6]={begin,then,if,while,do,end};voidscaner();voidIrparse();voidstatement();voidexpression_r();voidterm();voidfactor();voidmain(){intselect=-1;p=0;printf(pleaseinputsentence,endof'#'!\n);do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;printf(请输入1或2\n1.词法分析\n2.语法分析\n);scanf(%d,&select);if(select==1){do{scaner();switch(syn){case-1:printf(词法分析出错\n);break;default:printf(%d,%s\n,syn,token);break;}}while(syn!=0);printf(词法分析成功\n);}elseif(select==2){scaner();if(syn==1){Irparse();}//beginelse{printf(语法分析出错!请检查begin关键字\n);return;}if(syn==6)//end{scaner();if(syn==0){printf(恭喜语法分析成功\n);}else{printf(语法分析出错!请检查是否缺少'#'\n);}}else{printf(语法分析出错!请检查是否缺少'end'\n);}}getchar();}voidscaner(){for(n=0;n8;n++){token[n]='\0';}n=0;ch=prog[p++];while(ch==''){ch=prog[p++];}if((ch='a'&&ch='z')||(ch='A'&&ch='Z')){do{token[n++]=ch;ch=prog[p++];}while((ch='a'&&ch='z')||(ch='a'&&ch='z')||(ch='0'&&ch='9'));syn=10;for(n=0;n6;n++){if(strcmp(token,keyword[n])==0){syn=n+1;}}p--;//return;}elseif(ch='0'&&ch='9'){p--;do{token[n++]=prog[p++];ch=prog[p];}while(ch='0'&&ch='9');syn=11;return;}else{//ch=prog[p++];switch(ch){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=17;token[0]=ch;ch=prog[p++];if(ch=='='){token[1]=ch;syn++;}elsep--;break;case'':syn=20;token[0]=ch;ch=prog[p++];if(ch==''){token[1]=ch;syn++;}elseif(ch=='='){token[1]=ch;syn=syn+2;}elsep--;break;case'':syn=23;token[0]=ch;ch=prog[p++];if(ch=='='){token[1]=ch;syn++;}elsep--;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:printf(词法分析出错!请检查是否输入非法字符\n);syn=-1;break;}//return;}}voidIrparse(){scaner();statement();while(syn==26)//;{scaner();statement();}}voidstatement(){if(syn==10){scaner();if(syn==18){scaner();expression_r();}else{printf(语法分析出错!请检查表达式是否正确\n);return;}}else{printf(语法分析出错!请检查语句是否正确\n);return;}}voidexpression_r(){term();while(syn==13||syn==14)//+-{scaner();term();}}voidterm(){factor();while(syn==15||syn==16)//*/{scaner();factor();}}voidfactor(){if(syn==10||syn==11){scaner();}elseif(syn==27){scaner();expression_r();if(syn==28){scaner();}else{printf(语法分析出错!请检查是否缺少')'\n);return;}}else{printf(语法分析出错!请检查是否输入非法字符\n);return;}}四、程序测试结果对源程序x:=a+b*cend#的源文件,经过语法分析后如下Begina:=9;x:=2*3;b:=a+xend#五、总结通过对语法分析程序的设计和编写,使自己获得了很大的收获,并且使自己对语法分析程序的功能有了更进一步认识。通过这次实验也对编译原理课有了更多的认识,要弄清楚计算机底层的东西,学好编译原理是很重要的。如果以后有机会的话会深入学习一下编译原理。