四元式序列转换虚拟机目标代码一、实验目的1、熟悉和掌握四元式序列转换成目标代码的原理2、设计一个程序,能使给定的任一四元式转换成虚拟目标代码。二、实验步骤1、需求分析(1)、产生四元式序列翻译方案设计对于产生四元式序列的翻译方案的设计,以下面的作为例子关于赋值语句的四元式序列的翻译方案S::=id=E{p:=lookup(id.name);ifp≠NULLthengenquad('::',E.place,''*p.place)elseerror}E::=E1+E2{E.place:=newtemp;Fenquad('+',E1.place,E2.place,E.place)}E::=E1*E2{E.place:=newtemp;Fenquad('*',E1.place,E2.place,E.place)}E::=-E1{E.place:=newtemp;Genquad('NEG',E1.place,'',E.place)}E::=(E1){E.place:=E1.place}E::=id{p:=lookup(id.name);ifp≠NULLthenE.place:=*p.placeelseerror}其中,过程genquad(op,x,y,z)功能是生成四元式:opxyz(2)、四元式生成目标代码从四元式序列生成目标代码的工作的主要问题是运算分量与计算结果的存取问题,在生成目标指令时,要考虑四元式中运算分量是在寄存器中还是在内存中。当在寄存器中时,以后还会被使用否,等等。例如,对于四元式-xyz如果x和y都不在寄存器中,则可生成下列目标指令:MOVx,RiSUBy,Ri计算结果z在寄存器Ri中。如果寄存器Ri与寄存器Rj分别包含x与y。及x与y的值分别在寄存器Ri与Rj,且此四元式后不再引用x,可以为其生成目标指令:SUBRj,Ri计算结果z在Ri中。如果寄存器Ri包含x而y在内存单元,且此四元式后不再以用x,可以生成目标指令:SUBy,Ri或者MOVy,RjSUBRj,Ri计算结果z仍然在Ri中所以,生成目标代码时应考察四元式及其上下文。针对具体情况生成合适的目标指令3、程序的源程序(1)、source.cpp#includeiostream.h#includestdio.h#includestdlib.h#includefstream.h#includesource.hvoidchange_to_source(ofstreamptemp,char*s,DLNode*dl,structfour**temp,int&Rcount,char*item1,char*item2,inti);charkarray[][4]={+,-,,-,*,/,,,,=,=,:=,,go,[]=};chararray[17][7]={add,sub,mov,neg,mpy,div,cmp,cj,cj,cj=,cj=,cj=,cj,goto,itof,return,call};structfour{charitem[4][4];structfour*next;};voidinit_array0(charay[][4],intlength);voidinit_four(structfour**head){*head=newstructfour();(*head)-next=NULL;init_array0((*head)-item,4);}voidadd_four(structfour**fr,charparray[][4],intlength){structfour*temp=(*fr);structfour*t;while(temp-next!=NULL)temp=temp-next;t=newstructfour();t-next=NULL;for(inti=0;ilength;i++){strcpy(t-item[i],parray[i]);}temp-next=t;}intchange_style(char*item){for(inti=0;i15;i++){if(strcmp(item,karray[i])==0)returni;}return-1;}voidadd_char(char*sym,intlen,charch){inti=0;while(ilen&&sym[i]!='\0')i++;sym[i]=ch;}voidadd_array(chararray0[][4],intindex,char*array1){strcpy(array0[index],array1);}voidinit_array1(char*pch,intlen){inti=0;while(ilen&&pch[i]!='\0'){pch[i]='\0';i++;}}voidchange(char*s,charch,intcount){//chartemp[5];chartemp2[5];init_array1(s,5);//数字转换字符_itoa(count,temp2,10);s[0]=ch;strcat(s,temp2);}voidinit_array0(charay[][4],intlength){for(inti=0;ilength;i++){init_array1(ay[i],4);}}voidget_from(FILE*fp,structfour*fr){intch;chararray0[4][4];chararray1[4];intcount=0;init_array1(array1,4);init_array0(array0,4);while((ch=fgetc(fp))!=EOF){while(ch==''&&ch!=EOF)ch=fgetc(fp);while(ch!=''&&ch!='\n'&&ch!=EOF){add_char(array1,4,ch);ch=fgetc(fp);}while(ch==''&&ch!=EOF)//+abt1ch=fgetc(fp);if(ch!=''&&ch!='\n'&&ch!=EOF){add_array(array0,count,array1);count=(++count)%4;fseek(fp,-1,SEEK_CUR);init_array1(array1,4);}if(ch=='\n'){add_array(array0,count,array1);add_four(&fr,array0,4);count=0;init_array1(array1,4);init_array0(array0,4);}}}voidconvertor(ofstreamptemp,structfour**fr,DLNode*dl){inti;chars[6];structfour**temp=fr;intRcount=0;charitem1[4],item2[4];while((*temp)-next!=NULL){//charkarray[][3]={+,-,,-,*,/,,,,=,=,:=,,go};i=change_style((*temp)-next-item[0]);if(i==-1)break;elsechange_to_source(ptemp,s,dl,temp,Rcount,item1,item2,i);(*temp)=(*temp)-next;}}voidoutput(structfour*head){structfour*temp=head;while(temp-next!=NULL){for(inti=0;i4;i++)couttemp-next-item[i];coutendl;temp=temp-next;}}voidmain(){FILE*fp=fopen(four.txt,r);ofstreamtempp(temp.txt);FILE*fp2=fopen(result.txt,a+);structfour*head=newstructfour();init_four(&head);DLNode*head2;ListInitiate(&head2);get_from(fp,head);output(head);convertor(tempp,&head,head2);//_itoaif(fp==NULL){coutDDDendl;exit(0);}fclose(fp);ListOutput(head2);}voidchange_to_source(ofstreamptemp,char*s,DLNode*dl,structfour**stemp,int&Rcount,char*item1,char*item2,inti){structfour*temp=(*stemp);if(empty(dl)){ptempmovtemp-next-item[1],RRcountendl;ptemparray[i]temp-next-item[2],RRcountendl;change(s,'R',Rcount);ListInsert(dl,s,temp-next-item[3]);}else{DLNode*p=dl;init_array1(item1,4);while(p-prior!=dl){if(strcmp(temp-next-item[1],p-prior-destion)!=0){p=p-prior;}else{strcpy(item1,p-prior-source);break;}}p=dl;init_array1(item2,4);while(p-prior!=dl){if(strcmp(temp-next-item[2],p-prior-destion)!=0){p=p-prior;}else{strcpy(item2,p-prior-source);break;}}if(item1[0]!='\0'){if(item2[0]!='\0')//////////////////////////ptemparray[i]item1,item2endl;elseptemparray[i]item1,temp-next-item[2]endl;}else{if(item2[0]!='\0')ptemparray[i]temp-next-item[1],item2endl;else{Rcount++;ptempmovtemp-next-item[1],RRcountendl;ptemparray[i]temp-next-item[2],RRcountendl;change(s,'R',Rcount);//ListInsert(dl,s,temp-next-item[3]);}}change(s,'R',Rcount);ListInsert(dl,s,temp-next-item[3]);}}(2)、source.h#includestdlib.h#includestring.hstructnode{charsource[4];chardestion[4];structnode*next;structnode*prior;};typedefstructnodeDLNode;intListInitiate(DLNode**head){*head=newDLNode();if((*head)==NULL)return0;(*head)-prior=*head;(*head)-next=*head;return1;}intLi