辅导教师成绩实验日期实验时间1实验名称语法分析器的设计与实现2、实验目的掌握自上而下语法分析方法、自下而上语法分析方法3、实验要求(1)实验内容:四选一①设计及实现能够识别表达式的预测分析程序。文法如下:G[E]:E-E+T|TT-T*F|FF-(E)|i②设计及实现能够识别表达式的LR分析程序。文法如下:G[E]:E-E+T|TT-T*F|FF-(E)|i③设计及实现能够识别表达式的算符优先分析程序。文法如下:G[E]:E-E+T|TT-T*F|FF-P↑F|PP-(E)|i④设计及实现计算表达式的计算器。表达式中可包含+、-、*、/、(、)运算符。(2)实验要求:对已给的一个二元式形式表达式,能够检查有无语法错误。并指定出错位置。将表达式的语法树输出(或将语法分析过程输出)。4、实验原理根据自上而下和自下而上的语法分析思想实现语法分析程序。5、实验步骤(1)根据文法构造语法分析表。(2)编写总控程序实现语法分析。6、状态转换图及词法分析程序#includeiostream#includestdio.h#includestring#includestackusingnamespacestd;charVn[]={'E','e','T','t','F'};//定义文法的非终结符,小写字母e表示E’charVt[]={'i','+','*','(',')','#'};//定义文法的终结符intLENVt=sizeof(Vt);voidshowstack(stackcharst)//从栈底开始显示栈中的内容{inti,j;charch[100];j=st.size();for(i=0;ij;i++){ch[i]=st.top();st.pop();}for(i=j-1;i=0;i--){coutch[i];st.push(ch[i]);}}intfind(charc,chararray[],intn)//查找函数,返回布尔值{inti;intflag=0;for(i=0;in;i++){if(c==array[i])flag=1;}returnflag;}intlocation(charc,chararray[])//定位函数,指出字符所在位置,即将字母转换为数组下标值{inti;for(i=0;c!=array[i];i++);returni;}voiderror(){cout出错!endl;}voidanalyse(charVn[],charVt[],stringM[5][6],stringstr){inti,j,p,q,h,flag=1;chara,X;stackcharst;//定义堆栈st.push('#');st.push(Vn[0]);//#与识别符号入栈j=0;//j指向输入串的指针h=1;a=str[j];cout步骤分析栈剩余输入串所用产生式endl;while(flag==1){couth;//显示步骤h++;showstack(st);//显示分析栈中内容cout;for(i=j;istr.size();i++)coutstr[i];//显示剩余字符串X=st.top();//取栈顶符号放入Xif(find(X,Vt,LENVt)==1)//X是终结符if(X==a)//分析栈的栈顶元素和剩余输入串的第一个元素相比较if(X!='#'){coutX匹配endl;st.pop();a=str[++j];//读入输入串的下一字符}else{cout接受!endlendl;flag=0;}else{error();break;}else{p=location(X,Vn);//实现下标的转换(非终结符转换为行下标)q=location(a,Vt);//实现下标的转换(终结符转换为列下标)stringS1(NULL),S2(null);if(M[p][q]==S1||M[p][q]==S2)//查找二维数组中的产生式{error();break;}//对应项为空,则出错else{stringstr0=M[p][q];coutX--str0endl;//显示对应的产生式st.pop();if(str0!=$)//$代表“空”字符for(i=str0.size()-1;i=0;i--)st.push(str0[i]);//产生式右端逆序进栈}}}}main(){stringM[5][6]={Te,NULL,NULL,Te,NULL,NULL,NULL,+Te,NULL,NULL,$,$,Ft,NULL,NULL,Ft,NULL,NULL,NULL,$,*Ft,NULL,$,$,i,NULL,NULL,(E),NULL,NULL};//预测分析表jstringstr;interrflag,i;cout文法:E-E+T|TT-T*F|FF-(E)|iendl;cout请输入分析串(以#结束):endl;do{errflag=0;cinstr;for(i=0;istr.size();i++)if(!find(str[i],Vt,LENVt)){cout输入串中包含有非终结符str[i](输入错误)!endl;errflag=1;}}while(errflag==1);//判断输入串的合法性analyse(Vn,Vt,M,str);return0;}7、测试及结果8、心得如果有需要的请下载,并不是本人写的,我只是图方便转发一下