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=dab321badf704a53d08d339ecca5788f68531e5e;hp=26452e802f4b3afb5c92775d9316b322f187af5a;hb=3b1f56b927d0338469b2cf17225b8b0d54c61463;hpb=496e04d39934d3304e811af55b7e9911c1c46873 diff --git a/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java b/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java index 26452e8..dab321b 100644 --- a/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java +++ b/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java @@ -40,7 +40,7 @@ import com.quemaster.transformations.TransMessages; */ public class mjc2wsl{ //default version name, used if the file is not found - private static String versionN = "0.1.x"; + private static String versionN = "0.2.x"; private String versionFile = "/version.properties"; @@ -182,11 +182,11 @@ public class mjc2wsl{ 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 := < > > :"); @@ -211,17 +211,12 @@ 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("\tFI;\n\tPRINFLUSH(val)\nEND\n"); + ret.append("PRINFLUSH(@Format(format, val ))"); + ret.append("\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("PRINFLUSH(@Format(format, CHR(val)))"); + ret.append("\nEND\n"); } ret.append("\nEND"); @@ -366,7 +361,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: { @@ -602,18 +597,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; } @@ -645,13 +648,18 @@ public class mjc2wsl{ // read, print case bread: { - // TODO make it a char for read - messages.message("char is read like a number", TransMessages.M_WAR); - prl(createComment("char is read like a number", C_SPEC)); + // TODO maybe we'll need a bufer for multi chars! + prl(createStartVar("tempa")); + prl("@Read_Line_Proc(VAR tempa, Standard_Input_Port);"); + prl("tempa := @String_To_List(tempa)[1];"); + prl(createToEStack("tempa")); + prl(createEndVar()); + break; } 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; @@ -663,20 +671,19 @@ public class mjc2wsl{ prl(createTopTwoEStack()); if (genInlinePrint){ prl(createComment("print spacing and transformation",C_SPEC)); - prl("PRINFLUSH(SUBSTR(\" \", 0, MIN(10, MAX(0,tempa-1))), @List_To_String(< tempb >));"); + prl("PRINFLUSH(@Format(tempa, @List_To_String(< tempb >)));"); } else prl("Print_MJ_CHAR(tempb,tempa);"); prl(createEndVar()); break; } case print: { - // TODO printing numbers needs different lengths of spacing prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); if (genInlinePrint){ prl(createComment("print spacing",C_SPEC)); - prl("PRINFLUSH(SUBSTR(\" \", 0, MIN(10, MAX(0, tempa-SLENGTH(@String(tempb))))), tempb);"); + prl("PRINFLUSH(@Format(tempa,tempb));"); } else prl("Print_MJ(tempb,tempa);"); @@ -851,6 +858,8 @@ public class mjc2wsl{ genLocalVars = true; } else if (args[i].compareToIgnoreCase("--genGlobalVars") == 0) { genLocalVars = false; + } else { + System.err.println("unknown option: "+args[i]); } i++; }