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=78f30eb36c060084259e14f7a54df26b1879bcac;hp=26452e802f4b3afb5c92775d9316b322f187af5a;hb=9e84964fb3bb33b019cac3063c7944d89a0460c8;hpb=496e04d39934d3304e811af55b7e9911c1c46873 diff --git a/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java b/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java index 26452e8..78f30eb 100644 --- a/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java +++ b/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java @@ -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 := < > > :"); @@ -212,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"); @@ -366,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: { @@ -602,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; } @@ -645,13 +653,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; @@ -670,7 +683,6 @@ public class mjc2wsl{ break; } case print: { - // TODO printing numbers needs different lengths of spacing prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); @@ -851,6 +863,8 @@ public class mjc2wsl{ genLocalVars = true; } else if (args[i].compareToIgnoreCase("--genGlobalVars") == 0) { genLocalVars = false; + } else { + System.err.println("unknown option: "+args[i]); } i++; }