includechar prog[100],zhongjian[100],shu[500];char ch,zh;int syn,p,q,a,b,c,d; //p指向prog,q指向zhongjianint table[8][8]={ {1,1,-1,-1,-1,1,-1,1}, {1,1,-1,-1,-1,1,-1,1}, {1,1,1,1,-1,1,-1,1}, {1,1,1,1,-1,1,-1,1}, {-1,-1,-1,-1,-1,-1,-1,0}, {1,1,1,1,0,1,0,1}, {1,1,1,1,0,1,0,1}, {-1,-1,-1,-1,-1,0,-1,-1}};//存储算符优先关系表,大于为1,小于或等于为-1,其它为0表示出错char zhan[100];//数组栈int z,j;//z为栈顶指针,j为zhongjian数组指针void push(char ch)//入栈{ zhan[z++]=ch;}void pop()//出栈{ z--;}void putzhan()//打印栈内字符{ for(int i=0;i=j;m--) { shu[c++]=zhongjian[m]; } for(int i=z-1;i>0;i--) { shu[c++]=zhan[i]; } zh=ding2(); if(zh=='i') //当前比较为i,出栈一次 pop(); else //当前比较不为i,出栈三次 { pop(); pop(); pop(); } push('E'); //归约到E printf("归约\n"); shu[c++]=' '; shu[c++]='>'; shu[c++]='-'; shu[c++]=' '; } else { syn=-1; break; } zh=ding(); ch=zhongjian[j]; }}void loadch()//读入所有字符串{ int i=0; printf("请输入要进行算符优先分析的字符串:\n"); do { ch=getchar(); prog[i++]=ch; } while(ch!='#');}void scaner(){ syn=1; ch=prog[p++]; while(ch==' '||ch=='\n') { ch=prog[p++]; } switch(ch) { case'+':zhongjian[q++]='+';break; case'-':zhongjian[q++]='-';break; case'*':zhongjian[q++]='*';break; case'/':zhongjian[q++]='/';break; case'(':zhongjian[q++]='(';break; case')':zhongjian[q++]=')';break; case'i':zhongjian[q++]='i';break; case'#':zhongjian[q++]='#';syn=0;break; default: syn=-1;break; }}void saomiao(){ p=0;q=0; do { scaner(); if(syn==-1) { printf("输入符号有误!\n"); break; } } while(syn!=0);}void main(){ loadch(); saomiao(); if(syn==0) { chu(); analyse(); printf("#E\t#\t结束\n"); if (syn==0) { printf("该字符串可被文法识别\n"); printf("E"); for(int i=c;i>=0;i--) { printf("%c",shu[i]); } printf("\n"); } else { printf("该字符串不可被文法识别\n"); } } }。