#include<iostream.h>
#include"D:\C++\sfs\suanfu\headsource.h"
void main()
{
int i,j,k=0;
cout<<"请输入文法规则数:";
cin>>r;
cout<<"请输入文法规则:\n";
for(i=0;i<r;i++)
{
cin>>str[i]; //存储文法规则,初始化FIRSTVT集和LASTVT集
first[i][0]=0; //first[i][0]和last[i][0]分别表示str[i][0]非终结符的FIRSTVT集和LASTVT集中元素的个数
last[i][0]=0;
}
for(i=0;i<r;i++) //判断文法是否合法
{
for(j=0;str[i][j]!='\0';j++)
{
if(str[i][0]<'A'||str[i][0]>'Z')
{
cout<<"不是算符文法!\n";
exit(-1);
}
if(str[i][j]>='A'&&str[i][j]<='Z')
{
if(str[i][j+1]>='A'&&str[i][j+1]<='Z')
{
cout<<"不是算符文法!\n";
exit(-1);
}
}
}
}
for(i=0;i<r;i++)
{
for(j=0;str[i][j]!='\0';j++)
{
if((str[i][j]<'A'||str[i][j]>'Z')&&str[i][j]!='-'&&str[i][j]!='>'&&str[i][j]!='|')
vt[k++]=str[i][j];
}
}
vt[k]='#';
vt[k+1]='\0';
table();
cout<<"每个非终结符的FIRSTVT集为:\n"; //输出每个非终结符的FIRSTVT集
for(i=0;i<r;i++)
{
cout<<str[i][0]<<':';
for(j=0;j<first[i][0];j++)
{
cout<<first[i][j+1]<<' ';
}
cout<<'\n';
}
cout<<"每个非终结符的LASTVT集为:\n"; //输出每个非终结符的LASTVT集
for(i=0;i<r;i++)
{
cout<<str[i][0]<<':';
for(j=0;j<last[i][0];j++)
{
cout<<last[i][j+1]<<' ';
}
cout<<'\n';
}
cout<<"算符优先分析表如下:\n";
for(i=0;vt[i]!='\0';i++)
cout<<'\t'<<vt[i];
cout<<'\n';
for(i=0;i<k+1;i++)
{
cout<<vt[i]<<'\t';
for(j=0;j<k+1;j++)
{
cout<<data[i][j]<<'\t';
}
cout<<'\n';
}
cout<<"请输入文法输入符号串以#结束:";
cin>>input;
deal();
}
int deal()
{
int i,j,x,y,z,k=1;
s[k]='#'; //栈置初值
for(i=0;input[i]!='\0';i++); //计算输入串的长度
z=i;
i=0;
while((a=input[i])!='\0')
{
if(zhongjie(s[k])) //找栈顶的终结符
j=k;
else
j=k-1;
x=xiabiao(s[j]); //求栈顶的终结符和即将入栈的终结符优先级关系
y=xiabiao(a);
if(data[x][y]=='>') //栈顶的优先级比即将入栈的终结符高
{
out(1,k,s);
out(i,z,input);
cout<<"规约\n";
do //寻找可规约串
{
q=s[j]; //栈顶终结符
if(zhongjie(s[j-1]))
j=j-1;
else j=j-2;
x=xiabiao(s[j]);
y=xiabiao(q);
}while(data[x][y]!='<'); //找到s[j]的优先级比q的小为止
int m,n,N;
for(m=j+1;m<=k;m++)//把s[j+1]...s[k]规约为某个N
{
for(N=0;N<r1;N++)
for(n=1;string[N][n]!='\0';n++)
{
if(!zhongjie(s[m])&&!zhongjie(string[N][n]))
{
if(zhongjie(s[m+1])&&zhongjie(string[N][n+1])&&s[m+1]==string[N][n+1])
{
s[j+1]=string[N][0];
break;
}
}
else
if(zhongjie(s[m]))
if(s[m]==string[N][n])
{
s[j+1]=string[N][0];
break;
}
}
}
k=j+1;
if(k==2&&a=='#')
{
if(s[k]!=str[0][0])
{
out(1,k,s);
out(i,z,input);
cout<<"规约\n";
for(N=0;N<r1;N++)
if(string[N][0]==str[0][0]&&string[N][1]==s[k])
{
s[k]=str[0][0];
break;
}
}
out(1,k,s);
out(i,z,input);
cout<<"结束\n";
cout<<"输入串符合文法的定义!\n";
return 1;
}
}
else
if(data[x][y]=='<'||data[x][y]=='=')
{ //移进
out(1,k,s);
out(i,z,input);
cout<<"移进\n";
k++;
s[k]=a;
i++;
}
else
{
cout<<"\nflase";
return 0;
}
}
cout<<"\nflase";
return 0;