X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=mjc2wsl.git;a=blobdiff_plain;f=src%2Fmjc2wsl.java;h=52c75422b7b7a6bd6ecc6a044830c69da686dbce;hp=52fc10a93a8a3136273f3489cc046832e2fc18c8;hb=cfbe705d9e35ecdeae7a6e25ef79f8dff08999e3;hpb=db89b8c183549b20cc28609c4f491582da1685c8 diff --git a/src/mjc2wsl.java b/src/mjc2wsl.java index 52fc10a..52c7542 100644 --- a/src/mjc2wsl.java +++ b/src/mjc2wsl.java @@ -28,13 +28,15 @@ import java.util.*; * @author Doni Pracner, http://perun.dmi.rs/pracner http://quemaster.com */ public class mjc2wsl{ - public static String versionN = "0.1.5"; + public static String versionN = "0.1.6"; private TransMessages messages = new TransMessages(); private boolean genPauseAfterEachAddress=false, genPrintForEachAddress = false, genPrintEStackOnChange = false; + + private boolean genPopPush=false; /** Constant used for marking a regular comment from the original file */ public static final char C_REG = ' '; @@ -271,26 +273,37 @@ public class mjc2wsl{ public static String createComment(String str, char type) { return "C:\"" + type + str.replace("\"", "''") + "\";"; } + + // generalised stack operations + + private String createToStack(String stack, String var){ + if (genPopPush) + return "PUSH("+stack+"," + var + ");"; + else + return stack + " := <" + var + " > ++ " + stack +";"; + } - //Expression stack + private String createFromStack(String stack, String var){ + if (genPopPush) + return "POP("+ var + ", "+stack+");"; + else + return var + ":= HEAD("+stack+"); "+stack+" := TAIL("+stack+");"; + } +//Expression stack private String createToEStack(int i) { - String res = "mjvm_estack := <" + i + " > ++ mjvm_estack;"; - if (genPrintEStackOnChange) - res += "PRINT(\"eStack\",mjvm_estack);"; - return res; + return createToEStack(i+""); } private String createToEStack(String i) { - String res = "mjvm_estack := <" + i + " > ++ mjvm_estack;"; + String res = createToStack("mjvm_estack", i); if (genPrintEStackOnChange) res += "PRINT(\"eStack\",mjvm_estack);"; return res; } private String createFromEStack(String st) { - String res = st - + " := HEAD(mjvm_estack); mjvm_estack := TAIL(mjvm_estack);"; + String res = createFromStack("mjvm_estack",st); if (genPrintEStackOnChange) res += "PRINT(\"eStack\",mjvm_estack);"; return res; @@ -314,15 +327,15 @@ public class mjc2wsl{ //Method stack private String createToMStack(int i) { - return "mjvm_mstack := <" + i + " > ++ mjvm_mstack;"; + return createToMStack(i+""); } private String createToMStack(String i) { - return "mjvm_mstack := <" + i + " > ++ mjvm_mstack;"; + return createToStack("mjvm_mstack", i); } private String createFromMStack(String st) { - return st + " := HEAD(mjvm_mstack); mjvm_mstack := TAIL(mjvm_mstack);"; + return createFromStack("mjvm_mstack", st); } private String getRelationFor(int opcode) throws Exception { @@ -373,7 +386,10 @@ public class mjc2wsl{ case load_1: case load_2: case load_3: { - prl(createToEStack(createLocal(op - load_0))); + prl(createStartVar("tempa")); + prl("tempa :="+createLocal(op - load_0)+";"); + prl(createToEStack("tempa")); + prl(createEndVar()); break; } case store: { @@ -384,7 +400,10 @@ public class mjc2wsl{ case store_1: case store_2: case store_3: { - prl(createFromEStack(createLocal(op - store_0))); + prl(createStartVar("tempa")); + prl(createFromEStack("tempa")); + prl(createLocal(op - store_0)+" := tempa;"); + prl(createEndVar()); break; } @@ -684,6 +703,8 @@ public class mjc2wsl{ System.out.println(); printHelpOutput(); System.out.println(); + printHelpDirectives(); + System.out.println(); printHelpGenerating(); System.out.println(); printHelpHelp(); @@ -707,6 +728,11 @@ public class mjc2wsl{ System.out.println(" --genAll short for applying all code generation"); } + public void printHelpDirectives(){ + System.out.println("Alternatives for code generation:"); + System.out.println(" --genPopPush generate POP/PUSH instead of TAIL/HEAD"); + } + public void printHelpHelp() { System.out.println("Help and info options"); System.out.println(" -h basic help"); @@ -775,6 +801,8 @@ public class mjc2wsl{ genPrintEStackOnChange = true; genPrintForEachAddress = true; genPauseAfterEachAddress = true; + } else if (args[i].compareToIgnoreCase("--genPopPush") == 0) { + genPopPush = true; } i++; }