




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
編譯原理實(shí)驗(yàn)2010級軟件七班陳乾201000301018實(shí)驗(yàn)代碼:importjava.util.*;importjava.io.*;publicclasstest2{ /** *@paramargs */ Stringall,strToken; intindex,indexmain,indexsym,indexid,indexnum; intnumline; ArrayListsym,id,num,constword; ArrayListtableall,codeall; ArrayListneedfill,prowhere;//prowhere表示 //call的時候cal到的pro的index,needfill表示要回頭填充的jpc指令 ArrayListwhileback;//whileback存儲循環(huán)式j(luò)mp到的index charch; ArrayListstackall; booleanisend,isallover,isendmain,isallovermain,isopmain; BufferedReaderbis,bismain; BufferedWriterbw,bwmain; FileReaderfis,fismain; booleanendif,endifmain; intblockindex,codeindex,mainstart,codemain; intidnum=0,numbernum=0; intwhilenum=0; booleanismain;//標(biāo)識當(dāng)前編譯的是否為主程序 ArrayListstatuslink=newArrayList<Integer>(); ArrayListdynamiclink=newArrayList<Integer>(); ArrayListreturnlink=newArrayList<Integer>(); ArrayListsample=newArrayList(); publictest2(){ try{ fis=newFileReader("D:\\test1.txt");//說明部分 bis=newBufferedReader(fis); bw=newBufferedWriter(newFileWriter("D:\\testover1.txt")); fismain=newFileReader("D:\\test11.txt");//main函數(shù)部分 bismain=newBufferedReader(fismain); bwmain=newBufferedWriter(newFileWriter("D:\\testover11.txt")); }catch(Exceptione){ e.printStackTrace(); } endif=false;isallover=false; numline=0;isend=false; index=0; endifmain=false;isendmain=false;isallovermain=false; indexmain=0;indexsym=0;indexnum=0; isopmain=false;indexid=0; ch=''; all=""; blockindex=0;codeindex=2;codemain=0; strToken=null; sym=newArrayList(); id=newArrayList(); num=newArrayList(); prowhere=newArrayList<Object>(); needfill=newArrayList<Object>(); whileback=newArrayList<Object>(); codeall=newArrayList<Object>(); tableall=newArrayList<Object>(); stackall=newArrayList<Object>(); constword=newArrayList();//包含保留字 constword.add("procedure");constword.add("read"); constword.add("var");constword.add("write"); constword.add("begin"); constword.add("while"); constword.add("end");constword.add("do"); constword.add("if");constword.add("const"); constword.add("then");constword.add("odd"); constword.add("else");constword.add("call"); } publicvoidallStep(){//詞法分析總程序(分說明部分和主程序兩部分進(jìn)行) try{ while((all=bis.readLine())!=null){ numline=numline+1; all=all.trim(); index=0; isend=false; isallover=false; if(!endif) GestSym(); else break; } isopmain=true; endif=false; index=0; mainstart=sym.size()-1; while((all=bismain.readLine())!=null){ numline=numline+1; all=all.trim(); index=0; isend=false; isallover=false; if(!endif) GestSym(); else break; } }catch(Exceptione){ e.printStackTrace(); } } publicvoidGestSym(){//單步詞法分析 Stringsentence=""; while(!isallover&&!endif){ intcode; strToken=""; getChar(); getBC(); if(!isallover){ if(ifLetter()){ while(ifLetter()||ifDigit()){ Concat(); getChar(); if(isend) break; } Retract(); code=Reserve(); if(code==1){ if(strToken.length()>10) outeroor(numline,all); else{ InsertSYM(); sentence="<" +((String)sym.get(indexsym)) .toUpperCase()+",>"+"" +numline; indexsym=indexsym+1; } }else{ if(strToken.length()>10) outeroor(numline,all); else{ InsertID(); sentence="<"+(String)sym.get(indexsym)+"," +strToken+">"+""+numline; indexsym=indexsym+1; } } }elseif(ifDigit()){ while(ifDigit()){ Concat(); getChar(); if(isend) break; } Retract(); InsertNUM(); sentence="<"+(String)sym.get(indexsym)+"," +strToken+">"+""+numline; indexsym=indexsym+1; }elseif(ch=='='){ getChar(); if(ch=='='){ sentence="<==,"+">"+""+numline; sym.add("=="); indexsym=indexsym+1; }else{ Retract(); sentence="<=,"+">"+""+numline; sym.add("="); indexsym=indexsym+1; } }elseif(ch==':'){ getChar(); if(ch=='='){ sym.add(":="); sentence="<:=,"+">"+""+numline; indexsym=indexsym+1; }else{ Retract(); sentence="<:,"+">"+""+numline; sym.add(":"); indexsym=indexsym+1; } }elseif(ch=='+'){ sentence="<+,"+">"+""+numline; sym.add("+"); indexsym=indexsym+1; }elseif(ch=='*'){ getChar(); if(ch=='*'){ sentence="<**,"+">"+""+numline; sym.add("**"); indexsym=indexsym+1; }else{ Retract(); sentence="<*,"+">"+""+numline; sym.add("*"); indexsym=indexsym+1; } }elseif(ch=='>'){ getChar(); if(ch=='='){ sentence="<>=,"+">"+""+numline; sym.add(">="); indexsym=indexsym+1; }else{ Retract(); sentence="<>,"+">"+""+numline; sym.add(">"); indexsym=indexsym+1; } }elseif(ch=='<'){ getChar(); if(ch=='='){ sentence="<<=,"+">"+""+numline; sym.add("<="); indexsym=indexsym+1; }else{ Retract(); sentence="<<,"+">"+""+numline; sym.add("<"); indexsym=indexsym+1; } }elseif(ch=='.'){ sentence="<.,"+">"+""+numline; sym.add("."); indexsym=indexsym+1; }elseif(ch=='#'){ sentence="<#,"+">"+""+numline; sym.add("#"); indexsym=indexsym+1; }elseif(ch==','){ sentence="<,,"+">"+""+numline; sym.add(","); indexsym=indexsym+1; }elseif(ch==';'){ sentence="<;,"+">"+""+numline; sym.add(";"); indexsym=indexsym+1; }elseif(ch=='('){ sentence="<(,"+">"+""+numline; sym.add("("); indexsym=indexsym+1; }elseif(ch==')'){ sentence="<),"+">"+""+numline; sym.add(")"); indexsym=indexsym+1; }elseif(ch=='|'){ sentence="<|,"+">"+""+numline; sym.add("|"); indexsym=indexsym+1; }elseif(ch=='{'){ sentence="<{,"+">"+""+numline; sym.add("{"); indexsym=indexsym+1; }elseif(ch=='}'){ sentence="<},"+">"+""+numline; sym.add("}"); indexsym=indexsym+1; }elseif(ch=='}'){ sentence="</,"+">"+""+numline; sym.add("}"); indexsym=indexsym+1; }else outeroor(numline,all); try{ if(!isopmain){ bw.write(sentence); bw.newLine(); bw.flush(); }else{ bwmain.write(sentence); bwmain.newLine(); bwmain.flush(); } }catch(Exceptione){ e.printStackTrace(); } } } } publicchargetChar(){ if(index<all.length()) ch=all.charAt(index++); else{ isend=true; isallover=true; } returnch; } publicvoidouteroor(intnumline,Stringall){//輸出錯誤 endif=true; System.out.println("erroronline"+numline+",sentenceis:\"" +all+"\"!"); } publicchargetBC(){ while(ch==''){ if(index<all.length()) ch=getChar(); else{ isallover=true; break; } } returnch; } publicbooleanifLetter(){ if(ch>='A'&&ch<='z') returntrue; else returnfalse; } publicbooleanifDigit(){ if(ch>='0'&&ch<='9') returntrue; else returnfalse; } publicStringConcat(){ strToken=strToken+ch; returnstrToken; } publicvoidRetract(){ index=index-1; ch=''; } publicintReserve(){ if(constword.contains(strToken)){ return1; }else return0; } publicvoidInsertSYM(){ Stringtypesym=strToken.toUpperCase()+"SYM"; sym.add(typesym); } publicvoidInsertID(){ sym.add("IDENT"); id.add(strToken); } publicvoidInsertNUM(){ sym.add("NUMBER"); num.add(strToken); } publicvoidshowSym(){ for(inti=0;i<sym.size();i++){ System.out.print((String)sym.get(i)+""); } } publicvoidinfocode(){//中間代碼翻譯程序 inttx=0; intlev=1; intintallnum=3; inti=0,identindex=0,numindex=0; while(!(((String)sym.get(i)).equals("PROCEDURESYM"))){//剃除過程前面的內(nèi)容,id序列跟隨遞增 if(((String)sym.get(i)).equals("IDENT")){ identindex++; }elseif(((String)sym.get(i)).equals("NUMBER")){ numindex++; } i++; } for(;i<sym.size();){ if(i==mainstart){ intmainint=0; for(intj=0;j<((ArrayList)tableall.get(0)).size();j++){//先確定int語句,掃過局部變量聲明部分 String[]show=(String[])((ArrayList)tableall.get(0)) .get(j); if(show[1].equals("VARIABLE")) mainint++; } codemain=codeall.size()-1; codeall.add(gen("int",0,mainint+3)); } if(((String)sym.get(i)).equals("PROCEDURESYM")){ tx=1; String[]thispro=newString[2]; thispro[0]=(String)id.get(identindex++); thispro[1]=""+codeindex; prowhere.add(thispro); i=i+3; if(((String)sym.get(i)).equals("VARSYM")){ while(!((String)sym.get(i)).equals(";")){ if(((String)sym.get(i)).equals("IDENT")){ identindex++; intallnum++; } i++; } i++; } codeall.add(gen("int",0,intallnum)); if(((String)sym.get(i)).equals("BEGINSYM")){ int[]getbegin=slovebegin(i,lev,identindex,numindex); i=getbegin[0]; lev=getbegin[1]; identindex=getbegin[2]; numindex=getbegin[3]; } codeall.add(gen("opr",0,0)); }elseif(((String)sym.get(i)).equals("BEGINSYM")){ int[]getbegin=slovebegin(i,lev,identindex,numindex); i=getbegin[0]; lev=getbegin[1]; identindex=getbegin[2]; numindex=getbegin[3]; }else{ i++; } } codeall.add(gen("opr",0,0)); } publicvoidtestprowhere(){//測試存貯過程的數(shù)組 for(inti=0;i<prowhere.size();i++){ String[]thispro=(String[])prowhere.get(i); System.out.println(thispro[0]+""+thispro[1]+""); } } publicintreturnprotx(Stringindex){//查找對應(yīng)過程入口的索引 for(inti=0;i<prowhere.size();i++){ String[]thispro=(String[])prowhere.get(i); if(thispro[1].equals(index)) returni+1; } return-1; } publicint[]slovebegin(inti,inttx,intidentindex,intnumindex){//中間代碼翻譯begin部分 i++; while(!(((String)sym.get(i)).equals("ENDSYM"))){ if(((String)sym.get(i)).equals("IDENT")){//賦值語句 //i++; int[]getbegin=sloveopsentence(i,tx,identindex,numindex, false); i=getbegin[0]; tx=getbegin[1]; identindex=getbegin[2]; numindex=getbegin[3]; }elseif(((String)sym.get(i)).equals("WHILESYM")){//while循環(huán)語句 i++; whilenum++; intwhilebegin=codeindex; if(((String)sym.get(i)).equals("IDENT")){//獲取條件第一個標(biāo)識符 String[]thisnumis=searchfor((String)id.get(identindex), false); identindex++; if(i<mainstart) codeall.add(gen(thisnumis[1], (tx-Integer.parseInt(thisnumis[2])), Integer.parseInt(thisnumis[3]))); else codeall.add(gen(thisnumis[1],0, Integer.parseInt(thisnumis[3]))); }else{ System.out.println("常數(shù)構(gòu)成條件的情況"); } i++;//取到下一個運(yùn)算符 Stringop=(String)sym.get(i++);//存起運(yùn)算符,再指向下一個表達(dá)式 int[]getbegin=sloveopsentence(i,tx,identindex,numindex, true); i=getbegin[0]; tx=getbegin[1]; identindex=getbegin[2]; numindex=getbegin[3]; codeall.add(gen("opr",0,transformop(op)));//生成運(yùn)算符的中間代碼 i++;//指到do String[]forneedfill=newString[3]; forneedfill[0]=""+whilenum; forneedfill[1]=""+whilebegin; forneedfill[2]=""+(codeindex-2); needfill.add(forneedfill); codeall.add(gen("jpc",0,0)); i++; if(((String)sym.get(i)).equals("BEGINSYM")){ int[]getbeginw=slovebegin(i,tx,identindex,numindex); i=getbeginw[0]; tx=getbeginw[1]; identindex=getbeginw[2]; numindex=getbeginw[3]; }elseif(((String)sym.get(i)).equals("IDENT")){ i++; int[]getbegini=sloveopsentence(i,tx,identindex, numindex,false); i=getbegini[0]; tx=getbegini[1]; identindex=getbegini[2]; numindex=getbegini[3]; }elseif(((String)sym.get(i)).equals("WRITESYM")){ int[]getbeginw=writeop(i,tx,identindex,numindex); i=getbeginw[0]; tx=getbeginw[1]; identindex=getbeginw[2]; numindex=getbeginw[3]; }elseif(((String)sym.get(i)).equals("READSYM")){ int[]getbeginr=readop(i,tx,identindex,numindex); i=getbeginr[0]; tx=getbeginr[1]; identindex=getbeginr[2]; numindex=getbeginr[3]; } String[]forwhileback=newString[2]; for(intneedindex=0;needindex<needfill.size();needindex++){ String[]get=(String[])needfill.get(needindex); if(Integer.parseInt(get[0])==whilenum){ codeall.add(gen("jmp",0,Integer.parseInt(get[1]))); String[]recify=(String[])codeall.get(Integer .parseInt(get[2])); recify[3]=""+(codeindex); codeall.set(Integer.parseInt(get[2]),recify); } } }elseif(((String)sym.get(i)).equals("WRITESYM")){ int[]getbegin=writeop(i,tx,identindex,numindex); i=getbegin[0]; tx=getbegin[1]; identindex=getbegin[2]; numindex=getbegin[3]; }elseif(((String)sym.get(i)).equals("READSYM")){ int[]getbegin=readop(i,tx,identindex,numindex); i=getbegin[0]; tx=getbegin[1]; identindex=getbegin[2]; numindex=getbegin[3]; }elseif(((String)sym.get(i)).equals("CALLSYM")){ int[]getbegin=callop(i,tx,identindex,numindex); i=getbegin[0]; tx=getbegin[1]; identindex=getbegin[2]; numindex=getbegin[3]; } i++; } int[]backall=newint[4]; backall[0]=i; backall[1]=tx; backall[2]=identindex; backall[3]=numindex; returnbackall; } publicint[]callop(inti,inttx,intidentindex,intnumindex){//cal的中間代碼處理 i=i+1; Stringindex=findpro((String)id.get(identindex++)); codeall.add(gen("cal",0,Integer.parseInt(index))); int[]backall=newint[4]; backall[0]=i; backall[1]=tx; backall[2]=identindex; backall[3]=numindex; returnbackall; } publicStringfindpro(Stringpro){//尋找對應(yīng)過程入口 System.out.println("findpro"+pro); for(inti=0;i<prowhere.size();i++){ String[]thispro=(String[])prowhere.get(i); if(thispro[0].equals(pro)){ returnthispro[1]; } } return"0"; } publicint[]writeop(inti,inttx,intidentindex,intnumindex){//寫語句 i=i+2; int[]back=sloveopsentence(i,tx,identindex,numindex,true); codeall.add(gen("opr",0,transformop("write"))); codeall.add(gen("opr",0,15));//write的換行操作 returnback; } publicint[]readop(inti,inttx,intidentindex,intnumindex){//讀語句 i=i+3; codeall.add(gen("opr",0,transformop("read"))); String[]firstnumis=searchfor((String)id.get(identindex++),true); if(i<mainstart) codeall.add(gen(firstnumis[1], (tx-Integer.parseInt(firstnumis[2])), Integer.parseInt(firstnumis[3]))); else codeall.add(gen(firstnumis[1],0,Integer.parseInt(firstnumis[3]))); int[]backall=newint[4]; backall[0]=i; backall[1]=tx; backall[2]=identindex; backall[3]=numindex; returnbackall; } publicString[]gen(Stringop,intl,inta){//構(gòu)造字符串?dāng)?shù)組 String[]thiscode=newString[4]; thiscode[0]=""+codeindex++; thiscode[1]=op; if(ismain) thiscode[2]="0"; else thiscode[2]=""+l; thiscode[3]=""+a; returnthiscode; } publicString[]searchfor(Stringtarget,booleanissto){//查詢對應(yīng)名稱的內(nèi)容。issto為真,表示為sto語句 String[]attribute=newString[5]; booleanfindit=false; for(inti=0;i<tableall.size();i++){ for(intj=0;j<((ArrayList)tableall.get(i)).size();j++){ String[]show=(String[])((ArrayList)tableall.get(i)).get(j); if(show[0].equals(target)){ findit=true; if(show[1].equals("CONSTANT")){ attribute[1]="lit"; attribute[2]="0"; attribute[3]=show[2]; attribute[4]="0";//表示其為常數(shù),層差為0 }else{ if(issto) attribute[1]="sto"; else attribute[1]="lod"; attribute[2]=show[2]; attribute[3]=show[3]; attribute[4]="1";//表示層差需要計算 } attribute[0]=target; break; } } } if(!findit) attribute[1]="Error"; returnattribute; } publicint[]sloveopsentence(inti,inttx,intidentindex,intnumindex, booleanifonlyop){//處理表達(dá)式,ifonlyop為false,表示為賦值語句 //i停在表達(dá)式的最后一個字符上 ArrayListtempstackvar=newArrayList<String>(); ArrayListtempstackop=newArrayList<String>(); ArrayListtempstacknum=newArrayList<String>(); ArrayListbinarysort=newArrayList<Integer>();//二進(jìn)制串表示表達(dá)式中變量(1)和數(shù)字(0)和操作符(2)的順序 intbinaryindex=2; intstavarin=1,staopin=1,stanumin=0; intstoi=i; if(ifonlyop){ while(!(((String)sym.get(i)).equals(")")) &&!(((String)sym.get(i)).equals("DOSYM")) &&!(((String)sym.get(i)).equals("THENSYM"))){ if(((String)sym.get(i)).equals("IDENT")){ tempstackvar.add((String)id.get(identindex)); identindex++; binarysort.add(1); }elseif(((String)sym.get(i)).equals("NUMBER")){ tempstacknum.add((String)num.get(numindex)); binarysort.add(0); numindex++; }else{ tempstackop.add((String)sym.get(i)); binarysort.add(2); } i++; } }else{ while(!(((String)sym.get(i)).equals("ENDSYM")) &&!(((String)sym.get(i)).equals(";"))){ if(((String)sym.get(i)).equals("IDENT")){ tempstackvar.add((String)id.get(identindex)); identindex++; binarysort.add(1); }elseif(((String)sym.get(i)).equals("NUMBER")){ tempstacknum.add((String)num.get(numindex)); binarysort.add(0); numindex++; }else{ tempstackop.add((String)sym.get(i)); binarysort.add(2); } i++; } } i--; if(ifonlyop){ binaryindex=0; stavarin=0; staopin=0; stanumin=0; } for(;binaryindex<binarysort.size();binaryindex++){ if((Integer)binarysort.get(binaryindex)==1){//變量(1)) String[]thisnumis=searchfor( (String)tempstackvar.get(stavarin),false); if(thisnumis[4].equals("1")) if(stoi<mainstart) codeall.add(gen(thisnumis[1], (tx-Integer.parseInt(thisnumis[2])), Integer.parseInt(thisnumis[3]))); else codeall.add(gen(thisnumis[1],0, Integer.parseInt(thisnumis[3]))); else codeall.add(gen(thisnumis[1],0, Integer.parseInt(thisnumis[3]))); stavarin++; }elseif((Integer)binarysort.get(binaryindex)==0){//數(shù)字(0) codeall.add(gen("lit",0, Integer.parseInt((String)tempstacknum.get(stanumin)))); stanumin++; } } //操作符(2) if(tempstackop.size()>0) codeall.add(gen("opr",0, transformop((String)tempstackop.get(staopin)))); staopin++; if(!ifonlyop){ String[]firstnumis=searchfor((String)tempstackvar.get(0),true); if(stoi<mainstart) codeall.add(gen(firstnumis[1], (tx-Integer.parseInt(firstnumis[2])), Integer.parseInt(firstnumis[3]))); else codeall.add(gen(firstnumis[1],0, Integer.parseInt(firstnumis[3]))); } int[]backall=newint[4]; backall[0]=i; backall[1]=tx; backall[2]=identindex; backall[3]=numindex; returnbackall; } publicinttransformop(Stringop){//翻譯對應(yīng)操作符 if(op.equals("+")){ return2; }elseif(op.equals("-")){ return3; }elseif(op.equals("*")){ return4; }elseif(op.equals("/")){ return5; }elseif(op.equals("read")){ return16; }elseif(op.equals("write")){ return14; }elseif(op.equals("#")){ return9; } return-1; } publicString[]blocksmall(Stringa1,Stringa2,Stringa3,Stringa4){ String[]one=newString[4]; one[0]=a1; one[1]=a2; one[2]=a3; one[3]=a4; returnone; } publicvoidblock(inttx,intlev){//block造表 intdx=3; ArrayListtable=newArrayList<Object>(); String[]one=newString[4]; for(;blockindex<=mainstart;){ if(((String)sym.get(blockindex)).equals("CONSTSYM")){ one[1]="CONSTANT"; one[0]=(String)id.get(idnum++); one[2]=(String)num.get(numbernum++); one[3]=""; blockindex=blockindex+4; table.add(blocksmall(one[0],one[1],one[2],one[3])); while(((String)sym.get(blockindex)).equals(",")){ one[1]="CONSTANT"; one[0]=(String)id.get(idnum++); one[2]=(String)num.get(numbernum++); one[3]=""; table.add(blocksmall(one[0],one[1],one[2],one[3])); blockindex=blockindex+4; } }elseif(((String)sym.get(blockindex)).equals("VARSYM")){ one[1]="VARIABLE"; one[0]=(String)id.get(idnum++); one[2]=""+lev; one[3]=""+dx++; table.add(blocksmall(one[0],one[1],one[2],one[3])); blockindex=blockindex+2; while(((String)sym.get(blockindex)).equals(",")){ one[1]="VARIABLE"; one[0]=(String)id.get(idnum++); one[2]=""+lev; one[3]=""+dx++; table.add(blocksmall(one[0],one[1],one[2],one[3])); blockindex=blockindex+2; } }elseif(((String)sym.get(blockindex)).equals("PROCEDURESYM")){ one[1]="PROCEDURE"; one[0]=(String)id.get(idnum++); one[2]=""+0; one[3]=""; lev=1; if(tableall.size()>0){ ArrayListtablebefore=(ArrayList)tableall.get(0); tablebefore.add(blocksmall(one[0],one[1],one[2],one[3])); tableall.set(0,tablebefore); tableall.set(tx,table); }else{ table.add(blocksmall(one[0],one[1],one[2],one[3])); tableall.add(0,table); } tx++; ArrayListtablebenull=newArrayList<Object>(); one[1]="null"; one[0]="null"; one[2]="null"; one[3]="null"; tablebenull.add(blocksmall(one[0],one[1],one[2],one[3])); tableall.add(tx,tablebenull); blockindex=blockindex+3; block(tx,lev); return; }else{ if(((String)sym.get(blockindex)).equals("IDENT")) idnum++; blockindex=blockindex+1; } } if(tableall.size()>0){ tableall.set(tx,table); }else{ tableall.add(tx,table); } return; } publicvoidshowtable(inttx,intlev){//打印表 block(tx,lev); System.out.println("outer"+tableall.size()); for(inti=0;i<tableall.size();i++){ System.out.println(i); for(intj=0;j<(((ArrayList)tableall.get(i)).size());j++){ String[]show=(String[])((ArrayList)tableall.get(i)).get(j); if(!show[0].equals("null")){ if(show[1].equals("CONSTANT")) System.out.println("NAME:"+show[0]+"KIND:" +show[1]+"VAL:"+show[2]); elseif(show[1].equals("VARIABLE")) System.out.println("NAME:"+show[0]+"KIND:" +show[1]+"LEVEL:"+show[2]+"ADR:" +show[3]); else System.out.println("NAME:"+show[0]+"KIND:" +show[1]+"LEVEL:"+show[2]+"ADR:" +show[3]); } } } } publicvoidshowcodetable(){//打印中間代碼 for(inti=0;i<codeall.size();i++){ String[]temp=(String[])codeall.get(i); System.out.println(temp[0]+""+temp[1]+""+temp[2]+"" +temp[3]+""); } } publicvoidfortest3(){ System.out.println("實(shí)驗(yàn)三:"); showstack(0,0,codemain+1,0); } publicvoidshowstack(inttx,inttotalindex,intstart,intlinkindex){//打印寄存器狀態(tài) //tx表示棧頂寄存器可變數(shù)組的索引,cal發(fā)生時增加,opr00時減少 if(tx==0){ statuslink.add(0); dynamiclink.add(0);//動態(tài)鏈,誰調(diào)用這個過程,這個過程就指向調(diào)用者的位置。 returnlink.add(0); } intlev=0; while(!(((String[])codeall.get(start))[1].equals("opr")&&((String[])codeall.get(start))[3].equals("0"))){ String[]temp=(String[])codeall.get(start); System.out.println("指令寄存器I:"+temp[0]+""+temp[1]+"" +temp[2]+""+temp[3]+""); System.out.println("程序地址寄存器P:"+(Integer.parseInt(temp[0])+1)); System.out.println("棧頂寄存器:"); if(temp[1].equals("int")){ String[]all=newString[Integer.parseInt(temp[3])]; if(tx==0){ all[0]=(totalindex++)+"靜態(tài)鏈(SL):"+(Integer)statuslink.get(0); all[1]=(totalindex++)+"動態(tài)鏈(DL):"+(Integer)dynamiclink.get(0); all[2]=(totalindex++)+"返回地址(RA):"+(Integer)returnlink.get(0); }else{ intgettarget=statuslink.size()-2; all[0]=(totalindex++)+"靜態(tài)鏈(SL):"+(Integer)statuslink.get(gettarget); all[1]=(totalindex++)+"動態(tài)鏈(DL):"+(Integer)dynamiclink.get(gettarget); all[2]=(totalindex++)+"返回地址(RA):"+(Integer)returnlink.get(linkindex); } intg=3; for(intj=0;j<(((ArrayList)tableall.get(tx)).size());j++){ String[]show=(String[])((ArrayList)tableall.get(tx)) .get(j); if(!show[0].equals("null")){ if(show[1].equals("VARIABLE")){ all[g++]=(totalindex++)+""+show[0]; } } } sample.add(all); printsample(sample); }elseif(temp[1].equals("opr")){ if(Integer.parseInt(temp[3])==16){ String[]all=newString[1]; all[0]=(totalindex++)+"接收控制臺輸入READ"; sample.add(all); }elseif(Integer.parseInt(temp[3])==15){ System.out.println("控制臺換行"); }elseif(Integer.parseInt(temp[3])==14){ intendsample=sample.size()-1; sample.remove(endsample); System.out.println("輸出至控制臺WRITE"); }elseif(Integer.parseInt(temp[3])==2){ intendsample=sample.size()-1; sample.remove(endsample); totalindex=totalindex-2; String[]all=newString[1]; all[0]=totalindex+"加運(yùn)算結(jié)果"; sample.set(endsample-1,all); }elseif(Integer.parseInt(temp[3])==3){ intendsample=sample.size()-1; sample.remove(endsample); totalindex=totalindex-2; String[]all=newString[1]; all[0]=totalindex+"減運(yùn)算結(jié)果"; sample.set(endsample-1,all); }elseif(Integer.parseInt(temp[3])==4){ intendsample=sample.size()-1; sample.remove(endsample); totalindex=totalindex-2; String[]all=newString[1]; all[0]=totalindex+"乘運(yùn)算結(jié)果"; sample.set(endsample-1,all); }elseif(Integer.parseInt(temp[3])==5){ intendsample=sample.size()-1; sample.remove(endsample); totalindex=totalindex-2; String[]all=newString[1]; all[0]=totalindex+"除運(yùn)算結(jié)果"; sample.set(endsample-1,all); }elseif(Integer.parseInt(temp[3])==9){ intendsample=sample.size()-1; sample.remove(endsample); totalindex=totalindex-2; String[]all=newString[1]; all[0]=totalindex+"不等運(yùn)算結(jié)果"; sample.set(endsample-1,all); } printsample(sample); }elseif(temp[1].equals("sto")){ intendsample=sample.size()-1; sample.remove(endsample); totalindex--; printsample(sample); }elseif(temp[1].equals("lod")){ intvarindex=Integer.parseInt(temp[3]); lev=Integer.parseInt(temp[2]); Stringtopstack=getVar(lev,varindex); String[]all=newString[1]; all[0]=(totalindex++)+""+topstack; sample.add(all); printsample(sampl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大班冬季交通安全課件
- 行政事業(yè)單位合同
- 項(xiàng)目推進(jìn)時間表與工作計劃書
- 泥工裝修詳細(xì)合同
- 大型體育賽事組織協(xié)議
- 能源互聯(lián)網(wǎng)項(xiàng)目戰(zhàn)略合作協(xié)議
- 農(nóng)業(yè)機(jī)械維修技術(shù)作業(yè)指導(dǎo)書
- 季度運(yùn)營策略及任務(wù)部署會議紀(jì)要
- 設(shè)計行業(yè)設(shè)計方案修改免責(zé)協(xié)議
- 企業(yè)互聯(lián)網(wǎng)應(yīng)用服務(wù)推廣合作協(xié)議
- 2025年哈爾濱職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫完美版
- 老年重癥患者靜脈血栓栓塞癥預(yù)防中國專家共識(2023)解讀
- 北師大版四年級數(shù)學(xué)下冊期末測試卷(一)(含答案)
- 2025年云南省曲靖市富源縣能源局公開招聘引進(jìn)煤礦安全監(jiān)管急需緊缺人才筆試高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 初中語文新人教部編版七年級下冊第一單元核心素養(yǎng)教案(2025春詳細(xì)版)
- 婦產(chǎn)科學(xué)(甲)知到智慧樹章節(jié)測試課后答案2024年秋浙江大學(xué)
- 2025年春新外研版(三起)英語三年級下冊課件 Unit3第1課時startup
- FSC培訓(xùn)課件教學(xué)課件
- 2025年福建福州地鐵集團(tuán)招聘筆試參考題庫含答案解析
- 《小學(xué)數(shù)學(xué)“對分課堂”教學(xué)模式的實(shí)踐探索》3900字(論文)
- 初中數(shù)學(xué)幾何《旋轉(zhuǎn)模型費(fèi)馬點(diǎn)》壓軸題含答案解析
評論
0/150
提交評論