1实验二递归下降分析法一实验目的递归下降分析法。二实验要求(一)准备:1.阅读课本有关章节;2.考虑好设计方案;3.设计出模块结构、测试数据,初步编制好程序。(二)上课上机:将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。(三)程序要求:程序输入/输出示例:对下列文法,用递归下降分析法对任意输入的符号串进行分析:(1)E-TG(2)G-+TG|—TG(3)G-ε(4)T-FS(5)S-*FS|/FS(7)F-(E)(8)F-i输出的格式如下:(1)递归下降分析程序,编制人:姓名,学号,班级(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#(3)输出结果:i+i*i#为合法符号串备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。注意:(6)S-ε1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#;2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);3.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。三实验内容1.程序思路(1)定义部分:定义常量、变量、数据结构。(2)初始化:从文件将输入符号串输入到字符缓冲区中。(3)利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。(4)实验思路:2利用程序设计语言的知识和大量编程技巧,递归下降分析法是一种较实用的分析法,通过练习,掌握函数间相互调用的方法。四实验结果(1)当输入“i-i”,不但输出推导过程,还会把栈内的状态显示出来;(2)当输入“iii”,则直接输出“不符合该文法”;五实验总结通过这次试验,让我更加熟悉掌握了自上而下语法分析法的特点。掌握了递归下降语法分析的基本原理和方法。运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。此分析法简单,直观,易构造分析程序,但是实验要求不灵活,换另一套语法,就要重新写,但思路不变。在试验的过程中,遇到了一些小问题,算法思路不清晰,导致代码编写比较乱,后通过借鉴其它资料,把代码改写的更加精炼。通过这次试验,也让自己更加对算法感兴趣。源代码#includeiostream#includeiomanip#includestring#includevectorusingnamespacestd;3//stackStr:模拟栈strings,str,stackStr;inti;vectorstringv;voidE();voidG();voidT();voidS();voidF();voiderr();intcheck();voiderr();voidpush(stringpre,stringvalue);voiderr(){coutERRORendl;exit(0);}//将字符串存入输出栈voidpush(stringpre,stringvalue){intidx=stackStr.find_first_of(pre[0],0);if(value!=ε){stackStr.replace(idx,1,value);}else{stackStr.erase(idx,1);}v.push_back((pre+value+,+stackStr));}4//验证是否已经到栈底intcheck(){if(i=s.size()){return1;}elseif(s[i]=='#'){return1;}return0;}voidE(){push(E--,TG);T();G();}voidG(){if(s[i]=='+'||s[i]=='-'){str=s[i];str+=TG;push(G--,str);i++;T();G();}else{push(G--,ε);}}voidT(){5push(T--,FS);F();S();}voidS(){if(s[i]=='*'||s[i]=='/'){str=s[i];str+=FS;push(S--,str);i++;F();S();}else{push(S--,ε);}}voidF(){if(s[i]=='('){push(F--,(E));i++;E();if(s[i+1]==')'){i++;}else{err();}}elseif(s[i]=='i'){i++;6push(F--,i);}else{err();}}intmain(){cout===================================================endl;cout======endl;cout===递归下降分析===endl;cout======endl;cout===姓名:崔金鹏===endl;cout======endl;cout===班级:软件112班===endl;cout======endl;cout===学号:201101014217===endl;cout======endl;cout===================================================endl;while(cins){v.clear();i=0;stackStr=E#;E();if(check()){cout==\t正确endl;cout推导过程如下:endl;inti;for(i=0;iv.size();i++){coutv[i].substr(0,v[i].find_first_of(,,0))\t;7coutsetiosflags(ios::right)setw(10)v[i].substr(v[i].find_first_of(,,0)+1)endl;}}elsecout==\t不符合该文法endl;}return0;}