1、中间代码生成程序三地址#include#include#includeusing namespace std;stack state;stack symbol;/stack val;stack symbol2;char sen50;char sym126=/符号表 s,e,e,s,e,e, e,s,e,e,e,a, r,r,s,r,r,r, r,r,r,r,r,r, s,e,e,s,e,e, r,r,r,r,r,r, s,e,e,s,e,e, s,e,e,s,e,e, e,s,e,e,s,e, r,r,s,r,r,r, r,r,r,r,r,r, r,r,r,r,r,r;char snum126
2、=/数字表 5,1,1,4,2,1, 3,6,5,3,2,0, 2,2,7,2,2,2, 4,4,4,4,4,4, 5,1,1,4,2,1, 6,6,6,6,6,6, 5,1,1,4,2,1, 5,1,1,4,2,1, 3,6,5,3,11,4, 1,1,7,1,1,1, 3,3,3,3,3,3, 5,5,5,5,5,5;int go2123=/goto表 1,2,3, 0,0,0, 0,0,0, 0,0,0, 8,2,3, 0,0,0, 0,9,3, 0,0,10, 0,0,0, 0,0,0, 0,0,0, 0,0,0;void action(int i,char *&a,char &how
3、,int &num,char &A,int &b,int &k)/action函数i,a int j;/,r; char s1,s2,s3; char v; switch(*a) case i: /case d: j=0;break; case +: j=1;break; case *: j=2;break; case (: j=3;break; case ): j=4;break; case #: j=5;break; default: j=-1;break; if(j!=-1) how=symij; num=snumij; if(how=r) switch(num) case 1: A=E
4、,b=3; coutE1+T规约endl; s1=symbol2.top(); symbol2.pop(); s2=symbol2.top(); symbol2.pop(); s3=symbol2.top(); symbol2.pop(); symbol2.push(k+48); couttk=(v=(isdigit(s3)?t: )s3s2;cout(v=(isdigit(s1)?t: )s1endl; k+; break; case 2: A=E,b=1; coutT规约endl; break; case 3: A=T,b=3; coutT1*F规约endl; s1=symbol2.top
5、(); symbol2.pop(); s2=symbol2.top(); symbol2.pop(); s3=symbol2.top(); symbol2.pop(); symbol2.push(k+48); couttk=(v=(isdigit(s3)?t: )s3s2;cout(v=(isdigit(s1)?t: )s1endl; k+; break; case 4: A=T,b=1; coutF规约endl; break; case 5: A=F,b=3; cout(E)规约endl; break; case 6: A=F,b=1; coutid规约endl; break; defaul
6、t: break; int go(int t,char A)/gotot,A switch(A) case E: return go2t0;break; case T: return go2t1;break; case F: return go2t2;break; void error(int i,int j,char *&a)/error显示函数 couterrorendl; switch(j) case 1:/期望输入id或左括号,但是碰到+,*,或$,就假设已经输入id了,转到状态5 /state.push(5); /symbol.push(i);/必须有这个,如果假设输入id的话,符号
7、栈里必须有. cout缺少运算对象digitendl; break; case 2:/从输入中删除右括号 /a+; cout不配对的右括号endl; break; case 3:/期望碰到+,但是输入id或左括号,假设已经输入算符+,转到状态6 /state.push(6); /symbol.push(+); cout缺少运算符endl; break; case 4:/缺少右括号,假设已经输入右括号,转到状态11 /state.push(11); /symbol.push(); cout缺少右括号endl; break; case 5: /a+; cout*号无效,应该输入+号!sen; a=
8、sen; state.push(0);/先输入0状态 while(*a!=0) b=0;num=0;how=0;A=0; s=state.top(); q=*a; if(isalpha(*a) *a=i; action(s,a,how,num,A,b,k); if(how=s)/移进 cout移进endl; symbol.push(*a); state.push(num); if (q!=(&q!=) symbol2.push(q); a+; else if(how=r)/规约 for(int i=0;ib;i+) if(!state.empty() state.pop(); if(!symbol.empty() symbol.pop(); int t=state.top(); symbol.push(A); state.push(go(t,A); else if(how=a)/接受 cout成功接受endl; break; else error(s,num,a);/错误显示 cout输入有误,重新输入!endl; break; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1