《程序级结果学习资料学习资料.docx》由会员分享,可在线阅读,更多相关《程序级结果学习资料学习资料.docx(14页珍藏版)》请在三一文库上搜索。
1、.#include<iostream>#include<string>using namespace std;const int stacksize=32;class stackpublic:initstack();void push(char);char pop();bool isempty();void showstack();stack();private:int top;int base;char *istack;stack:initstack()istack=new charstacksize;top=base=0;void stack:push(char t
2、oken)if(top-base>=stacksize)cout<<"Overflow!"<<endl;exit(1);top+;istacktop-1=token;char stack:pop()if(top=base) cout<<"Empty!"<<endl;exit(1);top-;return istacktop;bool stack:isempty()if(top=base) return true;else return false;void stack:showstack()for(i
3、nt i=base;i<top;i+)cout<<istacki;stack:stack()base=top=0;delete istack;/*void main()stack s;s.initstack();s.push('e');s.push('r');if(!s.isempty() s.showstack();cout<<endl;char d=s.pop();cout<<d;*/stack s;void init()s.initstack();s.push('#');s.push('E&
4、#39;);char nt5='E','P','T','Q','F' /定义非终结符char t6='i','+','*','(',')','#' /定义终结符bool isterminal(char c)for(int i=0;i<5;i+)if(c=nti) return 0;return 1;void derivation_E()s.push('P');s.push('T');
5、void derivation_P()s.push('P');s.push('T');s.push('+');void derivation_T()s.push('Q');s.push('F');void derivation_Q()s.push('Q');s.push('F');s.push('*');void derivation_F()s.push('i');void derivation_F1()s.push(')');s.pu
6、sh('E');s.push('(');void LL1(string str)intl=str.length();int step=0,j=0,k=0,n=0;char ch,ter;init();cout<<"步骤"<<"t栈"<<"t输入缓冲区"<<"t输出"<<endl; cout<<" "<<step+;cout<<" t"s.showst
7、ack();cout<<" t"<<str<<endl;doch=s.pop(),ter=strj;if(!isterminal(ch)&&isterminal(ter)switch(ch)case 'E':switch(ter)case 'i':derivation_E();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<
8、<str<<" t E TP"<<endl;break;case '(':derivation_E();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;break;default:break;break;case 'P':switch(ter)case '+':derivation_P();
9、cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t P +TP"<<endl;ch=s.pop();for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();
10、cout<<" t"<<str<<endl;break; case ')':cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t Q "<<endl;ch=s.pop();if(ch=')')for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn
11、;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;else cout<<"编译失败!"<<endl;exit(1);break;case '#':cout<<" "<<step+;cout<<" t"s.showstack();cout
12、<<" t"<<str<<" t Q "<<endl;ch=s.pop();if(isterminal(ch)if(ch!='#') cout<<"编译失败!"<<endl;exit(1);else s.push(ch);break;default:break;break;case 'T':switch(ter)case 'i':derivation_T();cout<<" "<
13、<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t T FQ"<<endl;break; case '(':derivation_T();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t T
14、 FQ"<<endl;break;default:break;break;case 'Q':switch(ter)case '+':cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t Q "<<endl;break; case '*':derivation_Q();cout<<&q
15、uot; "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t Q *FQ"<<endl;ch=s.pop(); for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();cout<<&
16、quot; t"<<str<<endl;break;case ')':cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t Q "<<endl;break;case '#':cout<<" "<<step+;cout<<" t&quo
17、t;s.showstack();cout<<" t"<<str<<" t Q "<<endl;break;default:break;break;case 'F':switch(ter)case 'i':derivation_F();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<
18、;" t F i "<<endl;ch=s.pop();for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;break;case '(':derivation_F1();cout<<" "<<st
19、ep+;cout<<" t"s.showstack();cout<<" t"<<str<<" t F (E) "<<endl;ch=s.pop();for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<
20、str<<endl;break;default:break;break;default:cout<<"ERROR!"break;while(ch!='#');if(ter!='#') cout<<"编译不成功!"<<endl;else cout<<"编译成功!"<<endl;void main()cout<<"本实验的LL(1)文法为表达式文法:n"cout<<"tE E+T |
21、 Tn" cout<<"tT T*F | Fn" cout<<"tF i | (E)n"cout<<"消除E和T的左递归得到文法:n"cout<<"tE TPn"cout<<"tP +TP| n" cout<<"tT FQn"cout<<"tQ *FQ| n" cout<<"tF i | (E)n"string str;cout&l
22、t;<"输入表达式符号串(包含i+*()并以#结束):"cin>>str;cout<<"对输入串"<<str<<"进行预测分析过程为:"<<endl;LL1(str);#include<iostream>#include<string>using namespace std;const int stacksize=32;class stackpublic:initstack();void push(char);char pop();bool is
23、empty();void showstack();stack();private:int top;int base;char *istack;stack:initstack()istack=new charstacksize;top=base=0;void stack:push(char token)if(top-base>=stacksize)cout<<"Overflow!"<<endl;exit(1);top+;istacktop-1=token;char stack:pop()if(top=base) cout<<"
24、;Empty!"<<endl;exit(1);top-;return istacktop;bool stack:isempty()if(top=base) return true;else return false;void stack:showstack()for(int i=base;i<top;i+)cout<<istacki;stack:stack()base=top=0;delete istack;stack s;void init()s.initstack();s.push('#');s.push('E');c
25、har nt5='E','P','T','Q','F' /定义非终结符char t6='i','+','*','(',')','#' /定义终结符bool isterminal(char c)for(int i=0;i<5;i+)if(c=nti) return 0;return 1;void derivation_E()s.push('P');s.push('T');void de
26、rivation_P()s.push('P');s.push('T');s.push('+');void derivation_T()s.push('Q');s.push('F');void derivation_Q()s.push('Q');s.push('F');s.push('*');void derivation_F()s.push('i');void derivation_F1()s.push(')');s.push('
27、;E');s.push('(');void LL1(string str)intl=str.length();int step=0,j=0,k=0,n=0;char ch,ter;string str1;init();cout<<"步骤"<<"t栈"<<"t输入缓冲区"<<" 输出"<<endl; cout<<" "<<step+;cout<<" t"s.s
28、howstack();cout<<" t"<<str<<endl;doch=s.pop(),ter=strj;if(!isterminal(ch)&&isterminal(ter)switch(ch)case 'E':switch(ter)case 'i':derivation_E();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"
29、;<<str<<"t E TP"<<endl;break;case '(':derivation_E();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;break;default:break;break;case 'P':switch(ter)case '+':derivation_
30、P();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t P +TP"<<endl;ch=s.pop();/for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn;str1=str1;for(k=2;k<l;k+) str1+=strk;str=str1;l-;ter=str0;cout<<" &qu
31、ot;<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;break; case ')':cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t Q "<<endl;ch=s.pop();if(c
32、h=')')/for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn;str1=str1;for(k=2;k<l;k+) str1+=strk;str=str1;l-;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;else cout<<"编译失败!"<<endl;exit
33、(1);break;case '#':cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t Q "<<endl;ch=s.pop();if(isterminal(ch)if(ch!='#') cout<<"编译失败!"<<endl;exit(1);else s.push(ch);break
34、;default:break;break;case 'T':switch(ter)case 'i':derivation_T();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<"t T FQ"<<endl;break; case '(':derivation_T();cout<<" "
35、<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t T FQ"<<endl;break;default:break;break;case 'Q':switch(ter)case '+':cout<<" "<<step+;cout<<" t"s.showstack();cout<<"
36、t"<<str<<" t Q "<<endl;break; case '*':derivation_Q();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t Q *FQ"<<endl;ch=s.pop(); /for(k=0,n=1;k<l-1,n<l;k+,n+)s
37、trk=strn;str1=str1;for(k=2;k<l;k+) str1+=strk;str=str1;l-;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;break;case ')':cout<<" "<<step+;cout<<" t"s.showstack()
38、;cout<<" t"<<str<<" t Q "<<endl;break;case '#':cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<" t Q "<<endl;break;default:break;break;case 'F':swit
39、ch(ter)case 'i':derivation_F();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<"t F i "<<endl;ch=s.pop();/for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn;str1=str1;for(k=2;k<l;k+) str1+=strk;str=str1;l
40、-;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;break;case '(':derivation_F1();cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<&
41、lt;" t F (E) "<<endl;ch=s.pop();/for(k=0,n=1;k<l-1,n<l;k+,n+)strk=strn;str1=str1;for(k=2;k<l;k+) str1+=strk;str=str1;l-;ter=str0;cout<<" "<<step+;cout<<" t"s.showstack();cout<<" t"<<str<<endl;break;default:bre
42、ak;break;default:cout<<"ERROR!"break;while(ch!='#');if(ter!='#') cout<<"编译不成功!"<<endl;else cout<<"编译成功!"<<endl;void main()cout<<"本实验的LL(1)文法为表达式文法:n"cout<<"tE E+T | Tn" cout<<"tT T*
43、F | Fn" cout<<"tF i | (E)n"cout<<"消除E和T的左递归得到文法:n"cout<<"tE TPn"cout<<"tP +TP| n" cout<<"tT FQn"cout<<"tQ *FQ| n" cout<<"tF i | (E)n"string str;cout<<"输入表达式符号串(包含i+*()并以#结束):"cin>>str;cout<<"对输入串"<<str<<"进行预测分析过程为:"<<endl;LL1(str);: