#include"Head.h"
grammar Gra;
vector<FL> FL_VT;
vector<Mark> F_T;
vector<Mark> Stack;
int main()
{
Input();
//====================================================================//
int i,j,k,l,m,n,record;
Mark st;
FL st1;
string save;
for(i=0;i<Gra.Vn.length();i++)
{
st1.Name=Gra.Vn[i];
FL_VT.push_back(st1);
for(j=0;j<Gra.Vt.length();j++)
{
st.Left=Gra.Vn[i];
st.Right=Gra.Vt[j];
st.flag=false;
F_T.push_back(st);
}
}
for(i=0;i<Gra.Pro.size();i++)
if(Gra.Vt.find(Gra.Pro[i].Back[0])!=string::npos)
{
for(j=0;j<F_T.size();j++)
if(F_T[j].Left==Gra.Pro[i].Front&&F_T[j].Right==Gra.Pro[i].Back[0])
if(F_T[j].flag==false)
{
F_T[j].flag=true;
st.Left=F_T[j].Left;
st.Right=F_T[j].Right;
Stack.push_back(st);
}
}
else if(Gra.Vn.find(Gra.Pro[i].Back[0])!=string::npos&&Gra.Vt.find(Gra.Pro[i].Back[1])!=string::npos)
{
for(j=0;j<F_T.size();j++)
if(F_T[j].Left==Gra.Pro[i].Front&&F_T[j].Right==Gra.Pro[i].Back[1])
if(F_T[j].flag==false)
{
F_T[j].flag=true;
st.Left=F_T[j].Left;
st.Right=F_T[j].Right;
Stack.push_back(st);
}
}
while(Stack.size()!=0)
{
st.Left=Stack[Stack.size()-1].Left;
st.Right=Stack[Stack.size()-1].Right;
Stack.pop_back();
for(i=0;i<Gra.Pro.size();i++)
if(Gra.Pro[i].Back[0]==st.Left)
{
for(j=0;j<F_T.size();j++)
if(F_T[j].Left==Gra.Pro[i].Front&&F_T[j].Right==st.Right)
if(F_T[j].flag==false)
{
F_T[j].flag=true;
st.Left=F_T[j].Left;
st.Right=F_T[j].Right;
Stack.push_back(st);
}
}
}
for(i=0;i<F_T.size();i++)
{
for(j=0;j<FL_VT.size();j++)
if(FL_VT[j].Name==F_T[i].Left&&F_T[i].flag==true)
FL_VT[j].FirstVT.push_back(F_T[i].Right);
}
cout<<"各非终结符的FirstVT集合为:\n";
for(i=0;i<FL_VT.size();i++)
{
cout<<FL_VT[i].Name<<": ";
for(j=0;j<FL_VT[i].FirstVT.size();j++)
cout<<FL_VT[i].FirstVT[j]<<" ";
cout<<endl;
}
//============================================================//
Stack.clear();
F_T.clear();
//============================================================//
for(i=0;i<Gra.Vn.length();i++)
for(j=0;j<Gra.Vt.length();j++)
{
st.Left=Gra.Vn[i];
st.Right=Gra.Vt[j];
st.flag=false;
F_T.push_back(st);
}
for(i=0;i<Gra.Pro.size();i++)
if(Gra.Vt.find(Gra.Pro[i].Back[Gra.Pro[i].Back.length()-1])!=string::npos)
{
for(j=0;j<F_T.size();j++)
if(F_T[j].Left==Gra.Pro[i].Front&&F_T[j].Right==Gra.Pro[i].Back[Gra.Pro[i].Back.length()-1])
if(F_T[j].flag==false)
{
F_T[j].flag=true;
st.Left=F_T[j].Left;
st.Right=F_T[j].Right;
Stack.push_back(st);
}
}
else if(Gra.Vn.find(Gra.Pro[i].Back[Gra.Pro[i].Back.length()-1])!=string::npos&&Gra.Vt.find(Gra.Pro[i].Back[Gra.Pro[i].Back.length()-2])!=string::npos)
{
for(j=0;j<F_T.size();j++)
if(F_T[j].Left==Gra.Pro[i].Front&&F_T[j].Right==Gra.Pro[i].Back[Gra.Pro[i].Back.length()-2])
if(F_T[j].flag==false)
{
F_T[j].flag=true;
st.Left=F_T[j].Left;
st.Right=F_T[j].Right;
Stack.push_back(st);
}
}
while(Stack.size()!=0)
{
st.Left=Stack[Stack.size()-1].Left;
st.Right=Stack[Stack.size()-1].Right;
Stack.pop_back();
for(i=0;i<Gra.Pro.size();i++)
if(Gra.Pro[i].Back[Gra.Pro[i].Back.length()-1]==st.Left)
{
for(j=0;j<F_T.size();j++)
if(F_T[j].Left==Gra.Pro[i].Front&&F_T[j].Right==st.Right)
if(F_T[j].flag==false)
{
F_T[j].flag=true;
st.Left=F_T[j].Left;
st.Right=F_T[j].Right;
Stack.push_back(st);
}
}
}
for(i=0;i<F_T.size();i++)
{
for(j=0;j<FL_VT.size();j++)
if(FL_VT[j].Name==F_T[i].Left&&F_T[i].flag==true)
FL_VT[j].LastVT.push_back(F_T[i].Right);
}
cout<<"各非终结符的LastVT集合为:\n";
for(i=0;i<FL_VT.size();i++)
{
cout<<FL_VT[i].Name<<": ";
for(j=0;j<FL_VT[i].LastVT.size();j++)
cout<<FL_VT[i].LastVT[j]<<" ";
cout<<endl;
}
//===========================================================//
F_T.clear();
//===========================================================//关系确定
for(i=0;i<Gra.Vt.length();i++)
for(j=0;j<Gra.Vt.length();j++)
{
st.Left=Gra.Vt[i];
st.Right=Gra.Vt[j];
st.relation='N';
F_T.push_back(st);
}
for(i=0;i<Gra.Vt.size();i++)
{
for(j=0;j<Gra.Pro.size();j++)
if((l=Gra.Pro[j].Back.find(Gra.Vt[i]))!=string::npos)
{
save=Gra.Pro[j].Back;
record=0;
while((l=save.find(Gra.Vt[i]))!=string::npos)
{
save.erase(l,1);
l=l+record;
for(k=l+1;k<Gra.Pro[j].Back.length();k++)
if(Gra.Vt.find(Gra.Pro[j].Back[k])!=string::npos)
{
for(m=0;m<F_T.size();m++)
if(F_T[m].Left==Gra.Vt[i]&&F_T[m].Right==Gra.Pro[j].Back[k])
F_T[m].relation='=';
}
for(k=0;k<FL_VT.size();k++)
if(Gra.Pro[j].Back[l+1]==FL_VT[k].Name)
{
for(n=0;n<F_T.size();n++)
if(F_T[n].Left==Gra.Vt[i])
for(m=0;m<FL_VT[k].FirstVT.size();m++)
if(F_T[n].Right==FL_VT[k].FirstVT[m])
F_T[n].relation='<';
}
for(k=0;k<FL_VT.size();k++)
if(Gra.Pro[j].Back[l-1]==FL_VT[k].Name)
{
for(m=0;m<FL_VT[k].LastVT.size();m++)
for(n=0;n<F_T.size();n++)
if(FL_VT[k].LastVT[m]==F_T[n].Left&&F_T[n].Right==Gra.Vt[i])
F_T[n].relation='>';
}
record++;
}
}
if(i==Gra.Vt.size()-1)
{
for(j=0;j<FL_VT.size();j++)
if(FL_VT[j].Name==Gra.Start)
{
for(n=0;n<F_T.size();n++)
if(F_T[n].Left==Gra.Vt[i])
for(m=0;m<FL_VT[j].FirstVT.size();m++)
if(F_T[n].Right==FL_VT[j].FirstVT[m])
F_T[n].relation='<';
for(m=0;m<FL_VT[j].LastVT.size();m++)
for(n=0;n<F_T.size();n++)
if(FL_VT[j].LastVT[m]==F_T[n].Left&&F_T[n].Right==Gra.Vt[i])
F_T[n].relation='>';
for(n=0;n<F_T.size();n++)
if(F_T[n].Left==Gra.Vt[i]&&F_T[n].Right==Gra.Vt[i])
F_T[n].relation='=';
}
}
}
//==============================================================//
cout<<"优先关系矩阵如下\n";
cout<<"\t";
for(i=0;i<Gra.Vt.length();i++)
cout<<Gra.Vt[i]<<"\t";
cout<<"\n";
for(i=0;i<Gra.Vt.length();i++)
{
cout<<Gra.Vt[i]<<"\t";
for(j=0;j<Gra.Vt.length();j++)
{
for(k=0;k<F_T.size();k++)
if(F_T[k].Left==Gra.Vt[i]&&F_T[k].Right==Gra.Vt[j])
{
cout<<F_T[k].relation<<"\t";
break;
}
}
cout<<"\n";
}
cout<<"N表示不确定\n";
//================================================================//输入串分析
string input,input1;
char Q;
int flag1=0;
vector<char> cstack;
vector<string> state;
cstack.push_back('#');//初始化
cout<<"输入要分析的字符串(以#结束):";
cin>>input;
cout<<"步骤\t\t符号栈\t\t当前符号\t\t剩余串\t\t动作\n";
cout<<"----------------------------------------------------------------------------\n";
for(i=0,k=0,l=0;i<input.length();i++,l++)
{
//===============================================//
cout<<"("<<l+1<<")\t\t";
for(int s=0;s<cstack.size();s++)
{
cout<<cstack[s];
if(s==cstack.size()-1)
cout<<"\t\t";
}
cout<<input[i]<<"\t\t\t";
input1=input;
input1.erase(0,i+1);
cout<<input1<<"\t\t";
//===============================================//
if(Gra.Vt.find(cstack[k])!=string::npos)
j=k;
else
j=k-1;
for(m=0;m<F_T.size();m++)
{
if(F_T[m].Left==cstack[j]&&F_T[m].Right==input[i])
if(F_T[m].relation=='<')
{
cstack.push_back(input[i]);
k++;
state.push_back("移进");
break;
}
else if(F_T[m].rela