算符优先分析.h #include <iostream>#include <list> using namespace std;//创建一个list容器的实例LISTCHAR typedef list<char> LISTCHAR; //优先关系比较数组,其中'<','>'和'='表示优先关系,1,2....6表示6种类型的错误,而7则是规约完成的标志char Table[7][7]=...{ ...{'>','<','<','<','<','>','>'}, ...{'>','>','<','<','<','>','>'}, ...{'>','>','<','<','<','>','>'}, ...{'>','>','>','1','2','>','>'}, ...{'<','<','<','<','<','=','3'}, ...{'>','>','>','4','5','>','>'}, ...{'<','<','<','<','<','6','7'},};//该函数将比较的终结符转换为优先关系比较数组的下标值int Change(char ch)...{ int t; switch(ch) ...{ case '+':t=0;break; case '*':t=1;break; case '^':t=2;break; case 'i':t=3;break; case '(':t=4;break; case ')':t=5;break; case '#':t=6;break; } return t;}//该函数对优先关系比较数组Table[7][7]中的6种错误进行处理int Error(char a,char b)...{ int error=0; char x; x=Table[Change(a)][Change(b)]; switch(x) ...{ case '1': ...{ cout<<"'i'与'i'之间应有运算符"<<endl; error++; break; } case '2': ...{ cout<<"'i'与'('之间应有运算符"<<endl; error++; break; } case '3': ...{ cout<<"'('后应包括内容"<<endl; error++; break; } case '4': ...{ cout<<"')'后应是运算符"<<endl; error++; break; } case '5': ...{ cout<<"')'与'('间要有运算符"<<endl; error++; break; } case '6': ...{ cout<<"error six"; error++; break; } } return error;}//该函数获得符号栈list1的栈定终结符char GetListFinal(list<char> list1) ...{ char ch1; list<char>::iterator l1; for(l1=list1.begin();l1!=list1.end();++l1) ...{ if(*l1<'A'|| *l1>'Z') ...{ ch1=*l1; break; } } return ch1;}//该函数为规约和移进的中间过程的打印void Print(int i,list<char> list1,list<char> list2)...{ list<char>::iterator l1; list1.reverse(); cout<<i<<' '; for(l1=list1.begin();l1!=list1.end();++l1) cout<<*l1; cout<<" "; for(l1=list2.begin();l1!=list2.end();++l1) cout<<*l1; cout<<" ";} 算符优先分析.cpp #include "算符优先分析.h"void main()...{ cout<<"**************************算符优先分析的文法************************"<<endl; cout<<"** E->E+T|T **"<<endl; cout<<"*** T->T*F|F ***"<<endl; cout<<"**** F->P^F|P ****"<<endl; cout<<"*** P->(E)|i ***"<<endl; cout<<"** ----2008年5月12日 **"<<endl; cout<<"********************************************************************"<<endl; int i=0,j,k,error=0; char ch,ch1,ch2; LISTCHAR list1; //list1存放符号栈的内容 LISTCHAR list2; //list2存放输入串的内容 LISTCHAR::iterator l; //定义list容器的迭代子 list1.push_back('#'); //给符号栈中预置'#' cout<<"输入要分析的字符串,以#结束:"<<endl; cout<<" ==>:"; do...{ //将输入串存入list1中 ch=cin.get(); list2.push_back(ch); }while(ch!='#'); cout<<endl; cout<<"步骤"<<' '<<"符号栈"<<" "<<"输入串"<<" "<<"动作"<<endl; Print(i,list1,list2); cout<<"初始化"<<endl; do...{ ch1=GetListFinal(list1); //取得list1的首个终结符 ch2=list2.front(); //取得list2的首个字符 error=Error(ch1,ch2); //检查输入串有无错误 if(error==0) //error=0表示输入串无错误 ...{ j=Change(ch1); //将要比较的两个终结符转换为优先关系比较数组Table的下标 k=Change(ch2); if(Table[j][k]=='<' || Table[j][k]=='=') //进行移进操作处理 ...{ list1.push_front(ch2); list2.pop_front(); i++; Print(i,list1,list2); cout<<"移进"<<endl; } else if(Table[j][k]=='>') //进行规约操作处理 ...{ switch(ch1) ...{ case 'i': //规约的终结符为'i' ...{ list1.pop_front(); list1.push_front('E'); i++; Print(i,list1,list2); cout<<"归约,E->i"<<endl; break; } case '+': //规约的终结符为'+' ...{ list1.pop_front(); list1.pop_front(); list1.pop_front(); list1.push_front('E'); i++; Print(i,list1,list2); cout<<"归约,E->E+T"<<endl; break; } case '*': //规约的终结符为'*' ...{ list1.pop_front(); list1.pop_front(); list1.pop_front(); list1.push_front('T'); i++; Print(i,list1,list2); cout<<"归约,T->T*F"<<endl; break; } case '^': //规约的终结符为'^' ...{ list1.pop_front(); list1.pop_front(); list1.pop_front(); list1.push_front('F'); i++; Print(i,list1,list2); cout<<"归约,F->P^F"<<endl; break; } case ')': //规约的终结符为')' ...{ list1.pop_front(); list1.pop_front(); list1.pop_front(); list1.push_front('P'); i++; Print(i,list1,list2); cout<<"归约,P->(E)"<<endl; break; } } } if(Table[j][k]=='7') //'#'配对,规约完成 ...{ cout<<"归约完毕!"<<endl; break; } } else break; }while(1); }