编译原理算符优先分析C++源代码(共6页).doc
精选优质文档-倾情为你奉上算符优先分析器源代码:#include<iostream>#include<iomanip>#define MAX 100using namespace std;struct Stack /符号栈char dataMAX;int top;char Terminal6='','(',')','a','+','#' /终结符集合char Table66= /算符优先关系表'>', '<', '>', '<', '>', '>','<', '<', '=', '<', '<', '!','>', '>', '>', '!', '>', '>','>', '>', '>', '!', '>', '>','<', '<', '>', '<', '>', '!','<', '<', '!', '<', '!', '='/判断是否为终结符,是返回其所在位置i,否则返回-1int Is_Vt(char ch,char Terminal6)int i;for(i=0;i<6;i+)if(ch=Terminali) /输入符为终结符return i; return -1;/读入输入串,返回其长度int Getchar(int length,char StringMAX)int i;cout<<"*输入字符串的长度length="cin>>length;cout<<endl<<"*该输入串为:"for(i=0;i<length;i+)cin>>Stringi; return length;void PrintStack(Stack &st, int top) /输出栈中的内容for(int i=0;i<=top;i+) cout<<st.datai << " "cout << "tt"int main()Stack st; int length=0,Len,k;char StringMAX,ch;Len=Getchar(length,String); /获得输入串int j=0;ch=Stringj; /指向第一个输入符st.top=0;st.datast.top='#' /将#入栈cout<<endl<<"*分析过程*"<<endl;cout<<"符号栈"<<setw(15)<<"当前符号"<<setw(15)<<"剩余输入串"<<setw(20)<<"移进或归约"<<endl; /输出格式while(st.top!=1 | ch!='#')if(Is_Vt(ch,Terminal)!=-1) /输入符为终结符k=Is_Vt(ch,Terminal); /获取分析表Table的第二个下标int m,t; /t指向终结符在栈中的位置if(Is_Vt(st.datast.top,Terminal)!=-1) /栈顶为终结符m=Is_Vt(st.datast.top,Terminal);/获取分析表Table的第一个下标t=st.top;else /栈顶为非终结符,看top-1m=Is_Vt(st.datast.top-1,Terminal);/获取分析表Table的第一个下标t=st.top-1;if(Tablemk='<' | Tablemk='=') /栈顶符号的优先级小于等于输入符号,压栈PrintStack(st,st.top); /输出栈中内容cout<<ch<<setw(10); /输出当前符号for(int p=j+1;p<=Len;p+) /输出剩余输入串cout<<Stringp;cout<<"ttt"<<"移进"<<endl; /输出下一步进行的操作st.top+;st.datast.top=ch; /输入符移进栈中j+;ch=Stringj; /指向下一输入符else if(Tablemk='!') /两终结符的优先关系不确定cout<<endl<<"*分析出错!*"<<endl;return 0;else /栈顶符号的优先级大于输入符,归约int q; /表示分析表Table的行if(Is_Vt(st.datat-1,Terminal)!=-1) /终结符相邻符号也是终结符q=Is_Vt(st.datat-1,Terminal);/获得分析表Table的行t=t-1; /获得分析表Table的列else /t-1位置是一个非终结符q=Is_Vt(st.datat-2,Terminal);t=t-2;while(Tableqm!='<')m=q;if(Is_Vt(st.datat-1,Terminal)!=-1) /终结符相邻符号也是终结符q=Is_Vt(st.datat-1,Terminal);/获得分析表Table的行t=t-1; /获得分析表Table的列else /t-1位置是一个非终结符q=Is_Vt(st.datat-2,Terminal);t=t-2;PrintStack(st,st.top);cout<<ch<<setw(10);for(int p=j+1;p<=Len;p+)cout<<Stringp;cout<<"ttt"<<"归约"<<endl;st.top=t+1;st.datast.top='N'elsecout<<endl<<"*该输入串不是文法的句子!*"<<endl;return 0;PrintStack(st,st.top);cout<<ch<<setw(10);for(int p=j+1;p<=Len;p+)cout<<Stringp;cout<<"ttt"<<"接受"<<endl;cout<<endl<<"*分析成功:该输入串是文法的句子!*"<<endl;return 0;运行结果:专心-专注-专业