X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=mjc2wsl.git;a=blobdiff_plain;f=mjc2wsl.java;h=77d1c2816e49705fcc0f29cd1f363ca0891025e6;hp=f43dfeb6ab8f714c34d2d73f5f98d4e751bd583c;hb=c71e5a3dd0f09ee95241f3a856aeadbf98527dcf;hpb=a24993cfe39a1fd5b7db6e2ffe9f656955fb73bd diff --git a/mjc2wsl.java b/mjc2wsl.java index f43dfeb..77d1c28 100644 --- a/mjc2wsl.java +++ b/mjc2wsl.java @@ -9,7 +9,7 @@ import java.util.*; * @author Doni Pracner, http://perun.dmi.rs/pracner http://quemaster.com */ public class mjc2wsl{ - public static String versionN = "0.1"; + public static String versionN = "0.1.2"; //regular comments from the original file //OC when original code is inserted in the file, next to the translations @@ -26,7 +26,10 @@ public class mjc2wsl{ load_2 = 4, load_3 = 5, store = 6, - store_n = 7, + store_0 = 7, + store_1 = 8, + store_2 = 9, + store_3 = 10, getstatic = 11, putstatic = 12, getfield = 13, @@ -59,7 +62,12 @@ public class mjc2wsl{ dup = 40, dup2 = 41, jmp = 42, - jcc = 43, + jeq = 43, + jne = 44, + jlt = 45, + jle = 46, + jgt = 47, + jge = 48, call = 49, return_ = 50, enter = 51, @@ -71,20 +79,25 @@ public class mjc2wsl{ trap = 57; public String getStandardStart(){ - String ret ="C:\" This file automatically converted from microjava bytecode\";\n" - +"C:\" with mjc2wsl v "+versionN+"\";\n"; - ret +="VAR < tempa := 0, tempb := 0, tempres :=0,\n"+ - " stack := < >, t_e_m_p := 0 > :\n"; + StringBuilder ret = new StringBuilder("C:\" This file automatically converted from microjava bytecode\";\n" + +"C:\" with mjc2wsl v "+versionN+"\";\n"); - return ret; + ret.append("VAR < tempa := 0, tempb := 0, tempres :=0,\n"); + for (int i=0;i<=3;i++) ret.append("loc"+i+" := 0, "); + ret.append("\n estack := < >, t_e_m_p := 0 > :"); + + return ret.toString(); } public String getStandardEnd(){ return "SKIP\nENDVAR"; } - + + private boolean originalInComments = false; + private InputStream mainIn; - private PrintStream out = System.out; + private PrintWriter out = null; + private int counter = -1; private void pr(int i){ out.print(i); @@ -110,6 +123,7 @@ public class mjc2wsl{ }catch (IOException ex){ ex.printStackTrace(); } + counter++; return res; } @@ -121,6 +135,10 @@ public class mjc2wsl{ return (get2()<<16) + (get2()<<16>>>16); } + private String loc(int i){ + return "loc"+i; + } + /** * Creates a WSL comment with care to quote chars. */ @@ -139,24 +157,24 @@ public class mjc2wsl{ return "C:\""+type+str.replace("\"", "''")+"\";"; } - private String cmdToStack(int i){ - return "stack := <"+i+" > ++ stack;"; + private String cmdToEStack(int i){ + return "estack := <"+i+" > ++ estack;"; } - private String cmdToStack(String i){ - return "stack := <"+i+" > ++ stack;"; + private String cmdToEStack(String i){ + return "estack := <"+i+" > ++ estack;"; } - private String cmdFromStack(String st){ - return st+" := HEAD(stack); stack := TAIL(stack);"; + private String cmdFromEStack(String st){ + return st+" := HEAD(estack); estack := TAIL(estack);"; } private String getTopTwo(){ - return cmdFromStack("tempa")+cmdFromStack("tempb"); + return cmdFromEStack("tempa")+"\n"+cmdFromEStack("tempb"); } private String getTop(){ - return cmdFromStack("tempa"); + return cmdFromEStack("tempa"); } public void convertStream(InputStream ins){ @@ -165,78 +183,98 @@ public class mjc2wsl{ for (int i=0;i<14;i++) get(); prl(getStandardStart()); - + prl("SKIP;\n ACTIONS A_S_start:\n A_S_start == CALL a14 END"); int op = get(); while (op>=0){ + if (originalInComments) prl(createComment(""+op,C_OC)); + prl("a"+counter+" == "); switch(op) { case load: { - prl(cmdToStack(get())); + prl(cmdToEStack(loc(get()))); break; } - case load_0: { - prl(cmdToStack(0)); - break; - } - case const_: { - prl(cmdToStack(get4())); - break; + case load_0: case load_1: case load_2: case load_3: { + prl(cmdToEStack(loc(op-load_0))); + break; } - case const_0: { - prl(cmdToStack(0)); + case store: { + prl(cmdFromEStack(loc(get()))); break; } - case const_1: { - prl(cmdToStack(1)); + case store_0: case store_1: case store_2: case store_3: { + prl(cmdFromEStack(loc(op-store_0))); break; } - case const_2: { - prl(cmdToStack(2)); + case const_: { + prl(cmdToEStack(get4())); break; } - case const_3: { - prl(cmdToStack(3)); + + case const_0: case const_1: case const_2: + case const_3: case const_4: case const_5:{ + prl(cmdToEStack(op-const_0)); break; } - case const_4: { - prl(cmdToStack(4)); - break; + + case jmp: { + prl("CALL a"+(counter+get2())+";"); + break; } - case const_5: { - prl(cmdToStack(5)); - break; + case jeq: case jne: case jlt: + case jle: case jgt: case jge: { + prl(getTopTwo()); + prl("IF tempb >= tempa THEN CALL a"+(counter+get2())+" FI;"); + break; } + case add: { + prl(getTopTwo()); + prl("tempres := tempb + tempa;"); + prl(cmdToEStack("tempres")); + break; + } case div: { prl(getTopTwo()); - prl("tempr = tempa / tempb;"); - prl(cmdToStack("tempr")); + prl("tempres := tempb / tempa;"); + prl(cmdToEStack("tempres")); break; } case enter: { - prl(createComment("enter")); + prl(createComment("enter not fully procesed yet")); get();get(); break; } + case return_: { + prl(createComment("return not fully procesed yet")); + break; + } + case exit: { + prl(createComment("exit not fully procesed yet")); + break; + } //the prints case bprint: { - prl(getTop()); - prl("PRINT(tempa);"); + prl(getTopTwo()); + prl("PRINT(tempb);"); break; } case print: { //TODO need to make it a char - prl(getTop()); - prl("PRINT(tempa);"); + prl(getTopTwo()); + prl("PRINT(tempb);"); break; } default: prl(createComment("unknown op error: "+op,C_ERR)); break; } + op = get(); + if (op>=0) prl("CALL a"+counter+" END"); } + prl("CALL Z;\nSKIP END\nENDACTIONS;\n"); prl(getStandardEnd()); } @@ -249,17 +287,63 @@ public class mjc2wsl{ } } + public void printHelp(){ + System.out.println("MicroJava bytecode to WSL converter. v "+versionN+", by Doni Pracner"); + System.out.println("usage:\n\t {options} mjc2wsl filename [outfile]"); + System.out.println("options:\n\t--screen print output to screen"); + System.out.println("\t-o --oc include original code in comments"); + } + + public String makeDefaultOutName(String inname){ + String rez = inname; + if (inname.endsWith(".obj")) + rez = rez.substring(0,rez.length()-4); + return rez+".wsl"; + } + public void run(String[] args){ if (args.length == 0){ - System.out.println("MicroJava bytecode to WSL converter. v "+versionN+", by Doni Pracner"); - System.out.println("usage:\n\t mjc2wsl filename"); + printHelp(); }else{ - File f = new File(args[0]); + int i=0; + while (i=args.length) {System.out.println("no filename supplied");System.exit(2);} + File f = new File(args[i]); + + if (i+1