www.pudn.com > LR0.rar > LR(0).CPP
#include#include #include #include struct stack{ int top; int st[15]; //״̬ջ char sn[15]; //·ûºÅÕ» }*sign; struct analysis{ //¶¯×÷±í½á¹¹ char act; int status; }action[][6]={ {'s',5,'$',0,'$',0, 's',4,'$',0, '$',0}, {'$',0,'s',6,'$',0, '$',0,'$',0, 'A',0}, {'$',0,'r',2,'s',7, '$',0,'r',2, 'r',2}, {'$',0,'r',4,'r',4, '$',0,'r',4, 'r',4}, {'s',5,'$',0,'$',0, 's',4,'$',0, '$',0}, {'$',0,'r',6,'r',6, '$',0,'r',6, 'r',6}, {'s',5,'$',0,'$',0, 's',4,'$',0, '$',0}, {'s',5,'$',0,'$',0, 's',4,'$',0, '$',0}, {'$',0,'s',6,'$',0, '$',0,'s',11,'$',0}, {'$',0,'r',1,'s',7, '$',0,'r',1, 'r',1}, {'$',0,'r',3,'r',3, '$',0,'r',3, 'r',3}, {'$',0,'r',5,'r',5, '$',0,'r',5, 'r',5}}; analysis G[]={{'E',3},{'E',1},{'T',3},{'T',1},{'F',3},{'F',1}}; int go[][3]={1,2,3,99,99,99,99,99,99,99,99,99,8,2,3,99,99,99,99,9,3,99,99,10,99,99,99,99,99,99,99,99,99,99,99,99}; /***********************************************************************************************/ int index(char m) { int id; if((m=='i') || (m=='E')) { id=0; } else if((m=='+') || (m=='T')) { id=1; } else if((m=='*') || (m=='F')) { id=2; } else if(m=='(') { id=3; } else if(m==')') { id=4; } else if(m=='#') { id=5; } else { id=99; } return id; } /************************************************************************************************/ int main() { char instr[20],*current,a; int i=0,step=0,ix1,ia,ix2,ig,iG,back; bool flag=true; sign=new stack; cout<<"input(#):"; do { cin>>instr[i]; i++; } while(instr[i-1]!='#'); instr[i]='\0'; current=instr; sign->st[0]=0; sign->sn[0]='#'; sign->sn[1]='\0'; sign->top=0; cout<<"״̬"<<"\t\t"<<"·ûºÅ"<<"\t\t"<<"ÊäÈë´®"< st[0]<<"\t\t"< sn<<"\t\t"< st[sign->top]; if(ia==99) { cout<<"error"< top+=1; sign->sn[sign->top]=a; sign->sn[(sign->top)+1]='\0'; sign->st[sign->top]=action[ix1][ia].status ; current++; } else if(action[ix1][ia].act=='r') { iG=action[ix1][ia].status-1; //ÁãÏÂ±í¿ªÊ¼ back=G[iG].status; sign->top-=back; ix2=sign->st[sign->top]; ig=index(G[iG].act); if(go[ix2][ig]!=99) { sign->top+=1; sign->st[sign->top]=go[ix2][ig]; sign->sn[sign->top]=G[iG].act; sign->sn[(sign->top)+1]='\0'; } else { cout<<"error"< top ;i++) { cout< st[i]<<" "; } cout< top))< sn< sn))<