F - 算符优先分析
Description
E→E+T |T
T→T*F |F
F→(E) | i
该表达式文法是算符优先文法,其算符优先分析表为:
注意:构造算符优先分析表前,请先拓广文法,例如引入非终结符Q,令Q→#E#。
Input
输入数据有多行。
第一行为一个整数n(n<=50),代表文法中产生式的个数,其中不包括拓广文法增加的产生式。
接下来的n行,每行给出一个产生式。
最后一行给出待分析的输入串,长度不超过50个符号。
第一行为一个整数n(n<=50),代表文法中产生式的个数,其中不包括拓广文法增加的产生式。
接下来的n行,每行给出一个产生式。
最后一行给出待分析的输入串,长度不超过50个符号。
Output
要求输出该文法的算符优先分析表,输出格式请参考上面的表格。
算符优先分析表中算符的排列顺序为输入文法时终结符出现的顺序,#出现在最后。
算符之间的优先关系,分别用=、<和>表示,代表相同、低于和高于的优先关系。
第一行先输出一个空格,然后按顺序输出所有算符。
第二行开始第一列为对应的算符,接着输出对应算法之间的优先关系。
输出的最后一行表示对输入串的分析是否成功结束,如果成功分析结束输出Success,表示该输入串是文法的一个句子,否者输出Fail,表示该输入串不是文法的一个句子。
算符优先分析表中算符的排列顺序为输入文法时终结符出现的顺序,#出现在最后。
算符之间的优先关系,分别用=、<和>表示,代表相同、低于和高于的优先关系。
第一行先输出一个空格,然后按顺序输出所有算符。
第二行开始第一列为对应的算符,接着输出对应算法之间的优先关系。
输出的最后一行表示对输入串的分析是否成功结束,如果成功分析结束输出Success,表示该输入串是文法的一个句子,否者输出Fail,表示该输入串不是文法的一个句子。
Samples
Sample #1
Input
6
E->E+T
E->T
T->T*F
T->F
F->(E)
F->i
i+i*i
Output
+*()i#
+><<><>
*>><><>
(<<<=<
)>> > >
i>> > >
#<<< <=
Success
#include <iostream>
#include <string.h>
using namespace std;
string str[30][100];
char st[30][100],st1[30][100],order[60],st2[100][2],st3[100],st4[100][2];
int num[30],num1[30],bj1[30],bj2[150],sum[100][100],st3l,st4l;
char Stack[100],sta[100];
int top,top1,end1,number,bj0[150];
void print(char a)
{int b=a-'A';for(int i=0;i<num[b];i++){if(st[b][i]>='A'&&st[b][i]<='Z')print(st[b][i]);else st3[st3l++]=st[b][i];}
}
void print1(char a)
{int b=a-'A';for(int i=0;i<num1[b];i++){if(st1[b][i]>='A'&&st1[b][i]<='Z')print1(st1[b][i]);else st3[st3l++]=st1[b][i];}
}
void print_stack()
{for(int i=0;i<=top;i++)cout<<Stack[i];
}
void print_sta()
{if(top1+1==end1) cout<<"#";for(int i=top1+1;i<end1;i++)cout<<sta[i];
}
int main()
{int i,j,k,kk,m,n,nn,mm,bj,l,ll,bj3;char s;while(cin>>m){memset(bj0,0,sizeof(bj0)); //test9l=ll=bj3=st4l=0;for(i=0;i<150;i++)bj2[i]=0;for(i=0;i<30;i++){num[i]=0; num1[i]=0; bj1[i]=0;}string str1,str2;for(i=0;i<m;i++){cin>>str1;if(i==0) s=str1[0];mm=str1[0]-'A';n=str1.size();str2=str1.substr(3,n);char *p=&str2[0];//const char *d="|";//p=strtok(str3,d);//while(p!=NULL)//{bj=0;nn=strlen(p);if(nn==1){st[mm][num[mm]]=p[0];num[mm]++;st1[mm][num1[mm]]=p[0];num1[mm]++;if(p[0]<'A'||p[0]>'Z'){bj0[p[0]]=1; //test9if(p[0]!='#'){order[l++]=p[0]; bj2[p[0]]=1;}else bj3=1;}}else{int aa=0;char bb;for(j=0;j<nn;j++){if(p[j]<'A'||p[j]>'Z'){bj0[p[j]]=nn; //test9if(aa==0){bb=p[j];aa=1;}else{st4[st4l][0]=bb;st4[st4l++][1]=p[j];}if(bj2[p[j]]==0){if(p[j]!='#'){order[l++]=p[j];bj2[p[j]]=1;}else bj3=1;}if(bj!=1){bj=1;st[mm][num[mm]]=p[j];num[mm]++;}}if(j>0){if((p[j]<'A'||p[j]>'Z')&&p[j-1]>='A'&&p[j-1]<='Z'){st2[ll][0]=p[j-1];st2[ll++][1]=p[j];continue;}if((p[j-1]<'A'||p[j-1]>'Z')&&p[j]>='A'&&p[j]<='Z'){st2[ll][0]=p[j-1];st2[ll++][1]=p[j];}}}if(bj==0){st[mm][num[mm]]=p[0];num[mm]++;}bj=0;for(j=nn-1;j>=0;j--){if(p[j]<'A'||p[j]>'Z'){bj=1;st1[mm][num1[mm]]=p[j];num1[mm]++;break;}}if(bj==0){st1[mm][num[mm]]=p[0];num1[mm]++;}}//p=strtok(NULL,d);//}}order[l++]='#';bj2['#']=1;st2[ll][0]='#';st2[ll++][1]=s;st2[ll][0]=s;st2[ll++][1]='#';memset(sum,0,sizeof(sum));for(i=0;i<ll;i++){st3l=0;if(st2[i][0]>='A'&&st2[i][0]<='Z'){print1(st2[i][0]);for(j=0;j<l;j++){if(st2[i][1]==order[j]){for(k=0;k<st3l;k++){for(kk=0;kk<l;kk++){if(st3[k]==order[kk]){sum[kk][j]=3;break;}}}break;}}}else{print(st2[i][1]);for(j=0;j<l;j++){if(st2[i][0]==order[j]){for(k=0;k<st3l;k++){for(kk=0;kk<l;kk++){if(st3[k]==order[kk]){sum[j][kk]=1;break;}}}break;}}}}for(i=0;i<st4l;i++){for(j=0;j<l;j++){if(st4[i][0]==order[j]){for(k=0;k<l;k++){if(st4[i][1]==order[k]){sum[j][k]=2;break;}}break;}}}sum[l-1][l-1]=2;//test9cin>>sta;cout<<" ";for(i=0;i<l;i++)cout<<order[i];cout<<endl;for(i=0;i<l;i++){cout<<order[i];for(j=0;j<l;j++){if(sum[i][j]==1)cout<<"<";else if(sum[i][j]==2)cout<<"=";else if(sum[i][j]==3)cout<<">";else cout<<" ";}cout<<endl;}int flag=0;end1=strlen(sta);sta[end1]='#';end1++;top=number=top1=0;Stack[0]='#';bj0['#']=1;/*for(i=0;i<150;i++)cout<<bj0[i]<<" ";cout<<endl;*/for(i=0;i<end1;i++){if(bj0[sta[i]]==0){flag=1;break;}}while(top>=0){if(flag==1) break;//number++;//cout<<number<<"\t";//print_stack();mm=-1;for(i=top;i>=0;i--){if(Stack[i]<'A'||Stack[i]>'Z'){mm=i;break;}}if(mm==-1) {flag=1;break;}k=kk=-1;for(i=0;i<l;i++){if(order[i]==Stack[mm]){k=i;}if(order[i]==sta[top1]){kk=i;}}if(k==-1||kk==-1){flag=1;break;}//cout<<"\t";if(sum[k][kk]==1){//cout<<"<\t";}else if(sum[k][kk]==2){//cout<<"=\t";}else if(sum[k][kk]==3){//cout<<">\t";}else{flag=1;break;}//if(sta[top1]!='#') cout<<sta[top1]<<"\t";//else cout<<" \t";//print_sta();//cout<<"\t";if(sum[k][kk]==1){//cout<<"移进"<<endl;top1++;Stack[++top]=sta[top1-1];}else if(sum[k][kk]==2){if(sta[top1]!='#'){//cout<<"移进"<<endl;top1++;Stack[++top]=sta[top1-1];}else if(Stack[mm]=='#'){//cout<<"接受"<<endl;break;}}else if(sum[k][kk]==3){//cout<<"归约"<<endl;top-=(bj0[Stack[mm]]-1);Stack[top]='N';}}if(flag==0) cout<<"Success"<<endl;else cout<<"Fail"<<endl;}return 0;
}