X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=mjc2wsl.git;a=blobdiff_plain;f=src%2Fmjc2wsl.java;h=dec76fe6b66d64c19d3d707e6dfa63c010d9c613;hp=18551d13e89223770ff6ec177ef117d30645b74f;hb=13695fb09706ad9035f7acc12d7a09954ed1843d;hpb=9ad77207956d30c4ad2e3020d389989777e5b7b4;ds=sidebyside diff --git a/src/mjc2wsl.java b/src/mjc2wsl.java index 18551d1..dec76fe 100644 --- a/src/mjc2wsl.java +++ b/src/mjc2wsl.java @@ -28,8 +28,11 @@ import java.util.*; * @author Doni Pracner, http://perun.dmi.rs/pracner http://quemaster.com */ public class mjc2wsl{ - public static String versionN = "0.1.7"; + //default version name, used if the file is not found + private static String versionN = "0.1.x"; + private String versionFile = "version.properties"; + private TransMessages messages = new TransMessages(); private boolean genPauseAfterEachAddress=false, @@ -38,6 +41,8 @@ public class mjc2wsl{ private boolean genPopPush=false; + private boolean genInlinePrint=false; + /** Constant used for marking a regular comment from the original file */ public static final char C_REG = ' '; /** @@ -136,6 +141,24 @@ public class mjc2wsl{ return opMap; } + private Properties versionData; + + private String getVersion() { + if (versionData == null) { + versionData = new Properties(); + try { + versionData.load(getClass().getResourceAsStream(versionFile)); + } catch (IOException e) { + e.printStackTrace(); + } + } + String ver = versionData.getProperty("version"); + if (ver != null) + return ver; + else + return versionN; + } + public String getOpString(int op) { return getOpMap().get(op); } @@ -192,9 +215,7 @@ public class mjc2wsl{ public String createStandardStart(int numWords){ StringBuilder ret = new StringBuilder( "C:\" This file automatically converted from microjava bytecode\";\n" - +"C:\" with mjc2wsl v "+versionN+"\";\n\n"); - - ret.append(createAsciiString()); + +"C:\" with mjc2wsl v "+getVersion()+"\";\n"); ret.append("\nBEGIN"); ret.append("\nVAR <\n\t"); @@ -221,25 +242,23 @@ public class mjc2wsl{ ret.append("\nWHERE\n"); ret.append("\nFUNCT CHR(num) ==:\n"); - ret.append("\tSUBSTR(ascii,num,1)\n"); + ret.append("\t@List_To_String(< num >)\n"); ret.append("END\n"); - ret.append("\nPROC Print_MJ(val, format VAR)==\n"); - ret.append(createComment("print spacing", C_SPEC)); - ret.append("\n\tIF format>1 THEN\n\t\tFOR i:=2 TO "); - ret.append("format STEP 1 DO PRINFLUSH(\" \") OD\n"); - ret.append("\tFI;\n\tPRINFLUSH(val)\nEND\n"); - - ret.append("\nPROC Print_MJ_CHAR(val, format VAR)==\n"); - ret.append(createComment("print spacing", C_SPEC)); - ret.append("\n\tIF val=10 OR val=13 THEN\n"); - ret.append("\t\tPRINT(\"\");\n"); - ret.append("\tELSE\n"); - ret.append("\t\tIF format>1 THEN\n\t\t\tFOR i:=2 TO "); - ret.append("format STEP 1 DO PRINFLUSH(\" \") OD\n"); - ret.append("\t\tFI;\n\t\tPRINFLUSH(CHR(val))\n"); - ret.append("\tFI\n"); - ret.append("END\n"); + if (!genInlinePrint) { + ret.append("\nPROC Print_MJ(val, format VAR)==\n"); + ret.append(createComment("print spacing", C_SPEC)); + ret.append("\n\tIF format>1 THEN\n\t\tFOR i:=2 TO "); + ret.append("format STEP 1 DO PRINFLUSH(\" \") OD\n"); + ret.append("\tFI;\n\tPRINFLUSH(val)\nEND\n"); + + ret.append("\nPROC Print_MJ_CHAR(val, format VAR)==\n"); + ret.append(createComment("print spacing", C_SPEC)); + ret.append("\n\tIF format>1 THEN\n\t\tFOR i:=2 TO "); + ret.append("format STEP 1 DO PRINFLUSH(\" \") OD\n"); + ret.append("\tFI;\n\tPRINFLUSH(CHR(val))\n"); + ret.append("END\n"); + } ret.append("\nEND"); return ret.toString(); @@ -442,17 +461,18 @@ public class mjc2wsl{ case getfield: { int f = get2(); + prl(createStartVar("tempa")); prl(createTopEStack()); prl(createToEStack(createObject("tempa") + "[" + (f + 1) + "]")); + prl(createEndVar()); break; } case putfield: { int f = get2(); - // we need to use a temparray as a pointer, WSL - // otherwise tries to access it as a list of lists and fails - prl(createTopTwoEStack()); - prl("VAR < tempArray := " + createObject("tempb") + " > :"); - prl("tempArray[" + (f + 1) + "]:=tempa ENDVAR;"); + prl(createStartVar("tempa", "tempb")); + prl(createTopTwoEStack()); + prl(createObject("tempb") + "[" + (f + 1) + "]:=tempa;"); + prl(createEndVar()); break; } @@ -461,6 +481,11 @@ public class mjc2wsl{ break; } + case const_m1: { + prl(createToEStack(-1)); + break; + } + case const_0: case const_1: case const_2: @@ -523,19 +548,23 @@ public class mjc2wsl{ } case shl: { + prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); prl("VAR :"); prl("\tFOR i:=1 TO tempa STEP 1 DO tempres := tempres * 2 OD;"); prl(createToEStack("tempres")); prl("ENDVAR;"); + prl(createEndVar()); break; } case shr: { + prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); prl("VAR :"); prl("\tFOR i:=1 TO tempa STEP 1 DO tempres := tempres DIV 2 OD;"); prl(createToEStack("tempres")); prl("ENDVAR;"); + prl(createEndVar()); break; } @@ -556,16 +585,20 @@ public class mjc2wsl{ case newarray: { get();// 0 - bytes, 1 - words; ignore for now // TODO take into consideration 0/1 + prl(createStartVar("tempa")); prl(createTopEStack()); prl("mjvm_arrays := mjvm_arrays ++ < ARRAY(tempa,0) >;"); prl(createToEStack("LENGTH(mjvm_arrays)")); + prl(createEndVar()); break; } case aload: case baload: { + prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); prl(createToEStack(createArray("tempb") + "[tempa+1]")); + prl(createEndVar()); break; } case astore: @@ -578,24 +611,30 @@ public class mjc2wsl{ break; } case arraylength: { + prl(createStartVar("tempa", "tempb")); prl(createTopEStack()); prl("tempb := LENGTH("+ createArray("tempa") + ");"); prl(createToEStack("tempb")); + prl(createEndVar()); break; } case dup: { + prl(createStartVar("tempa", "tempb")); prl(createTopEStack()); prl(createToEStack("tempa")); prl(createToEStack("tempa")); + prl(createEndVar()); break; } case dup2: { + prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); prl(createToEStack("tempb")); prl(createToEStack("tempa")); prl(createToEStack("tempb")); prl(createToEStack("tempa")); + prl(createEndVar()); break; } @@ -674,7 +713,11 @@ public class mjc2wsl{ case bprint: { prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); - prl("Print_MJ_CHAR(tempb,tempa);"); + if (genInlinePrint){ + prl(createComment("print spacing and transformation",C_SPEC)); + prl("PRINFLUSH(SUBSTR(\" \", 0, MIN(10, MAX(0,tempa-1))), @List_To_String(< tempb >));"); + } else + prl("Print_MJ_CHAR(tempb,tempa);"); prl(createEndVar()); break; } @@ -683,7 +726,12 @@ public class mjc2wsl{ prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); - prl("Print_MJ(tempb,tempa);"); + if (genInlinePrint){ + prl(createComment("print spacing",C_SPEC)); + prl("PRINFLUSH(SUBSTR(\" \", 0, MIN(10, MAX(0, tempa-SLENGTH(@String(tempb))))), tempb);"); + } + else + prl("Print_MJ(tempb,tempa);"); prl(createEndVar()); break; } @@ -760,6 +808,10 @@ public class mjc2wsl{ public void printHelpDirectives(){ System.out.println("Alternatives for code generation:"); System.out.println(" --genPopPush generate POP/PUSH instead of TAIL/HEAD"); + System.out.println(" --genHeadTail generate TAIL/HEAD instead of POP/PUSH "); + System.out.println(); + System.out.println(" --genInlinePrint generate prints directly instead of procedure calls"); + System.out.println(" --genProcedurePrint generate prints as custom procedure calls"); } public void printHelpHelp() { @@ -774,7 +826,7 @@ public class mjc2wsl{ } public void printVersion() { - System.out.println("MicroJava bytecode to WSL converter. v " + versionN + System.out.println("MicroJava bytecode to WSL converter. v " + getVersion() + ", by Doni Pracner"); } @@ -832,6 +884,12 @@ public class mjc2wsl{ genPauseAfterEachAddress = true; } else if (args[i].compareToIgnoreCase("--genPopPush") == 0) { genPopPush = true; + } else if (args[i].compareToIgnoreCase("--genInlinePrint") == 0) { + genInlinePrint = true; + } else if (args[i].compareToIgnoreCase("--genHeadTail") == 0) { + genPopPush = false; + } else if (args[i].compareToIgnoreCase("--genProcedurePrint") == 0) { + genInlinePrint = false; } i++; }