x=stack[i];stack.erase(i,1);i--;//取栈顶符号x,并从栈顶退出 //cout< if(u.find(x)!=string::npos)//x是终结符的情况 { if(x==a) { s.erase(0,1);a=s[0];//栈顶符号与当前输入符号匹配,则输入下一个符号 cout<<\ \\n\未使用产生式,输出空 } else { cout<<\ cout< } if(x=='#') { if(a=='#') {flag=1;cout<<\成功\\n\栈顶和余留输入串都为#,匹配成功 else { cout<<\ cout< if(U.find(x)!=string::npos)//x是非终结符的情况 { p=U.find(x); q=u.find(a); if(a=='#') q=t; temp=table[p][q]; cout< r=9; while(temp[r]==' ') r--; while(r>3) { if(temp[r]!='^') { stack.append(1,temp[r]);//将X::=x1x2...的规则右部各符号压栈 i++; } r--; } } else { cout<<\ cout< } step++; } if(flag) cout< int main() { int i,j; string *G=new string[50];//文法G string *P=new string[50];//产生式集合P string U,u;//文法G非终结符集合U,终结符集合u int n,t,k;//非终结符、终结符个数,产生式数 string *GG=new string[50];//消除左递归后的文法GG string *PP=new string[50];//文法GG的产生式集合PP string UU,uu;//文法GG非终结符集合U,终结符集合u int nn,tt,kk;//消除左递归后的非终结符、终结符个数,产生式数 string** table;//分析表 cout<<\ 欢迎使用LL(1)语法分析器!\\n\\n\\n\ cout<<\请输入文法(同一左部的规则在同一行输入,例如:E::=E+T|T;用^表示空串)\\n\ input_grammer(G); preprocess(G,P,U,u,n,t,k); cout<<\该文法有\个非终结符:\\n\ for(i=0;i cout<<\该文法有\个终结符:\\n\ for(i=0;i cout<<\ 左递归检测与消除\\n\\n\ if(eliminate_1(G,P,U,GG)) { preprocess(GG,PP,UU,uu,nn,tt,kk); cout<<\该文法存在左递归!\\n\\n消除左递归后的文法:\\n\\n\ for(i=0;i cout<<\新文法有\个非终结符:\\n\ for(i=0;i cout<<\新文法有\个终结符:\\n\ for(i=0;i //cout<<\新文法有\个产生式:\\n\ //for(i=0;i {cout<<\该文法不存在左递归\\n\ GG=G;PP=P;UU=U;uu=u;nn=n;tt=t;kk=k; } cout<<\ 求解FIRST集\\n\\n\ int *empty=ifempty(PP,UU,kk,nn); string* first=FIRST_X(PP,UU,uu,empty,kk,nn); for(i=0;i cout<<\ \ cout<<\ 求解FOLLOW集\\n\\n\ for(i=0;i cout<<\ \ cout<<\ 构造文法分析表\\n\\n\ table=create_table(PP,UU,uu,nn,tt,kk,first); cout<<\ \ for(i=0;i cout< cout<<\ 分析符号串\\n\\n\ string s; cout<<\请输入要分析的符号串\\n\ cin>>s; analyse(table,UU,uu,tt,s); return 0; } 3、程序演示结果 (1)输入文法 (2)消除左递归 (3)求解FIRST和FOLLOW集
相关推荐: