X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=mjc2wsl.git;a=blobdiff_plain;f=src%2Fcom%2Fquemaster%2Ftransformations%2Fmjc2wsl%2Fmjc2wsl.java;h=c890fefed757c443c72e6ae48d3ac3ba5f1fcad5;hp=68fd2a108c4c2efde206cb26696852636ee32f4d;hb=fa49662f7c1f1ff9104e73b987d5115c1ab85a25;hpb=91b863207c21295ff02240fffa877097a2b66817 diff --git a/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java b/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java index 68fd2a1..c890fef 100644 --- a/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java +++ b/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java @@ -42,7 +42,7 @@ public class mjc2wsl{ //default version name, used if the file is not found private static String versionN = "0.1.x"; - private String versionFile = "version.properties"; + private String versionFile = "/version.properties"; private TransMessages messages = new TransMessages(); @@ -52,7 +52,9 @@ public class mjc2wsl{ private boolean genPopPush=false; - private boolean genInlinePrint=false; + private boolean genInlinePrint = false; + + private boolean genLocalVars = true; /** Constant used for marking a regular comment from the original file */ public static final char C_REG = ' '; @@ -178,10 +180,13 @@ public class mjc2wsl{ ret.append("\nBEGIN"); ret.append("\nVAR <\n\t"); + if (!genLocalVars){ + ret.append("\n\ttempa := 0, tempb :=0, tempres := 0,"); + } else + ret.append("\n\tmjvm_flag_jump := 0,"); ret.append("mjvm_locals := ARRAY(1,0),"); ret.append("\n\tmjvm_statics := ARRAY("+numWords+",0),"); ret.append("\n\tmjvm_arrays := < >,"); - ret.append("\n\tmjvm_flag_jump := 0,"); ret.append("\n\tmjvm_objects := < >,"); ret.append("\n\tmjvm_estack := < >, mjvm_mstack := < > > :"); @@ -207,8 +212,8 @@ public class mjc2wsl{ 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("\n\tIF format>1 THEN\n\t\tFOR i:=1 TO "); + ret.append("MAX(0, format-SLENGTH(@String(tempb))) STEP 1 DO PRINFLUSH(\" \") OD\n"); ret.append("\tFI;\n\tPRINFLUSH(val)\nEND\n"); ret.append("\nPROC Print_MJ_CHAR(val, format VAR)==\n"); @@ -224,17 +229,23 @@ public class mjc2wsl{ } private String createStartVar(String... vars){ - StringBuilder ret = new StringBuilder("VAR < "); - ret.append(vars[0] + " := 0"); - for (int i=1; i : "); - - return ret.toString(); + if (genLocalVars) { + StringBuilder ret = new StringBuilder("VAR < "); + ret.append(vars[0] + " := 0"); + for (int i = 1; i < vars.length; i++) + ret.append(", " + vars[i] + " := 0"); + ret.append(" > : "); + + return ret.toString(); + } + return ""; } private String createEndVar(){ - return "ENDVAR;"; + if (genLocalVars) + return "ENDVAR;"; + else + return ""; } private String createLocal(int i) { @@ -355,7 +366,7 @@ public class mjc2wsl{ if (genPrintForEachAddress) { prl("PRINT(\"a" + mjInput.getCounter() + "\");"); if (genPauseAfterEachAddress) - prl("debug_disposable_string := @Read_Line(Standard_Input_Port);"); + prl("@Read_Line_Proc(VAR debug_disposable_string, Standard_Input_Port);"); } switch (op) { case load: { @@ -591,18 +602,26 @@ public class mjc2wsl{ case jle: case jgt: case jge: { - prl(createStartVar("tempa", "tempb")); - prl(createTopTwoEStack()); - prl("IF tempb " + mjInput.getRelationFor(op) - + " tempa THEN mjvm_flag_jump := 1" - + " ELSE mjvm_flag_jump := 0" - + " FI;"); - prl(createEndVar()); - prl("IF mjvm_flag_jump = 1 THEN CALL a" - + (mjInput.getCounter() + mjInput.get2()) - + " ELSE CALL a" + (mjInput.getCounter() + 1) - + " FI;"); - + if (genLocalVars) { + prl(createStartVar("tempa", "tempb")); + prl(createTopTwoEStack()); + prl("IF tempb " + mjInput.getRelationFor(op) + + " tempa THEN mjvm_flag_jump := 1" + + " ELSE mjvm_flag_jump := 0" + + " FI;"); + prl(createEndVar()); + prl("IF mjvm_flag_jump = 1 THEN CALL a" + + (mjInput.getCounter() + mjInput.get2()) + + " ELSE CALL a" + (mjInput.getCounter() + 1) + + " FI;"); + } else { + prl(createTopTwoEStack()); + prl("IF tempb " + mjInput.getRelationFor(op) + + " tempa THEN CALL a" + + (mjInput.getCounter() + mjInput.get2()) + + " ELSE CALL a" + (mjInput.getCounter() + 1) + + " FI;"); + } break; } @@ -640,7 +659,8 @@ public class mjc2wsl{ } case read: { prl(createStartVar("tempa")); - prl("tempa := @String_To_Num(@Read_Line(Standard_Input_Port));"); + prl("@Read_Line_Proc(VAR tempa, Standard_Input_Port);"); + prl("tempa := @String_To_Num(tempa);"); prl(createToEStack("tempa")); prl(createEndVar()); break; @@ -659,7 +679,6 @@ public class mjc2wsl{ break; } case print: { - // TODO printing numbers needs different lengths of spacing prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); @@ -743,12 +762,21 @@ 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("Alternatives for code generation (* are the defaults):"); + System.out.print(genPopPush?'*':' '); + System.out.println(" --genPopPush generate POP/PUSH instead of TAIL/HEAD"); + System.out.print(!genPopPush?'*':' '); + System.out.println(" --genHeadTail generate TAIL/HEAD instead of POP/PUSH "); + System.out.println(); + System.out.print(genInlinePrint?'*':' '); + System.out.println(" --genInlinePrint generate prints directly instead of procedure calls"); + System.out.print(!genInlinePrint?'*':' '); + System.out.println(" --genProcedurePrint generate prints as custom procedure calls"); System.out.println(); - System.out.println(" --genInlinePrint generate prints directly instead of procedure calls"); - System.out.println(" --genProcedurePrint generate prints as custom procedure calls"); + System.out.print(genLocalVars?'*':' '); + System.out.println(" --genLocalVars generate local VAR block for temp variables"); + System.out.print(!genLocalVars?'*':' '); + System.out.println(" --genGlobalVars do NOT generate local VAR block for temp variables"); } public void printHelpHelp() { @@ -827,6 +855,12 @@ public class mjc2wsl{ genPopPush = false; } else if (args[i].compareToIgnoreCase("--genProcedurePrint") == 0) { genInlinePrint = false; + } else if (args[i].compareToIgnoreCase("--genLocalVars") == 0) { + genLocalVars = true; + } else if (args[i].compareToIgnoreCase("--genGlobalVars") == 0) { + genLocalVars = false; + } else { + System.err.println("unknown option: "+args[i]); } i++; }