gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control systemdiff --git a/src/mjc2wsl.java b/src/mjc2wsl.java
--- a/src/mjc2wsl.java
+++ b/src/mjc2wsl.java
+"C:\" with mjc2wsl v "+versionN+"\";\n");
ret.append("BEGIN ");
- ret.append("VAR < tempa := 0, tempb := 0, tempres :=0,\n\t");
+ ret.append("VAR < \n\t");
ret.append("mjvm_locals := ARRAY(1,0), ");
ret.append("\n\tmjvm_statics := ARRAY("+numWords+",0), ");
ret.append("\n\tmjvm_arrays := < >, ");
return ret.toString();
}
+ private String createStartVar(String... vars){
+ 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();
+ }
+
+ private String createEndVar(){
+ return "ENDVAR;";
+ }
+
private String createLocal(int i) {
// arrays start at 1 in WSL, so we need an offset
return "mjvm_locals[" + (i + 1) + "]";
int mainAdr = get4();
prl(createStandardStart(numberOfWords));
- prl("SKIP;\n ACTIONS A_S_start:\n A_S_start == CALL a" + (14 + mainAdr)
- + " END");
+ prl("SKIP;\n ACTIONS a" + (14 + mainAdr) + " :");
int op = get();
while (op >= 0) {
if (originalInComments)
prl(createComment(describeOpCode(op), C_OC));
- prl("a" + counter + " == ");
+ prl(" a" + counter + " == ");
if (genPrintForEachAddress) {
prl("PRINT(\"a" + counter + "\");");
if (genPauseAfterEachAddress)
}
case add: {
+ prl(createStartVar("tempa", "tempb", "tempres"));
prl(createTopTwoEStack());
prl("tempres := tempb + tempa;");
prl(createToEStack("tempres"));
+ prl(createEndVar());
break;
}
case sub: {
+ prl(createStartVar("tempa", "tempb", "tempres"));
prl(createTopTwoEStack());
prl("tempres := tempb - tempa;");
prl(createToEStack("tempres"));
+ prl(createEndVar());
break;
}
case mul: {
+ prl(createStartVar("tempa", "tempb", "tempres"));
prl(createTopTwoEStack());
prl("tempres := tempb * tempa;");
prl(createToEStack("tempres"));
+ prl(createEndVar());
break;
}
case div: {
+ prl(createStartVar("tempa", "tempb", "tempres"));
prl(createTopTwoEStack());
prl("IF tempa = 0 THEN ERROR(\"division by zero\") FI;");
prl("tempres := tempb DIV tempa;");
prl(createToEStack("tempres"));
+ prl(createEndVar());
break;
}
case rem: {
+ prl(createStartVar("tempa", "tempb", "tempres"));
prl(createTopTwoEStack());
prl("IF tempa = 0 THEN ERROR(\"division by zero\") FI;");
prl("tempres := tempb MOD tempa;");
prl(createToEStack("tempres"));
+ prl(createEndVar());
break;
}
case neg: {
+ prl(createStartVar("tempa"));
prl(createTopEStack());
prl(createToEStack("-tempa"));
+ prl(createEndVar());
break;
}
case jle:
case jgt:
case jge: {
+ prl(createStartVar("tempa", "tempb"));
prl(createTopTwoEStack());
prl("IF tempb " + getRelationFor(op) + " tempa THEN CALL a"
+ (counter + get2()) + " ELSE CALL a" + (counter + 1)
+ " FI;");
+ prl(createEndVar());
+
break;
}
case return_: {
// we let the actions return
// there is nothing to clean up
- prl("SKIP END b" + counter + " ==");
+ prl("SKIP\n END\n b" + counter + " ==");
break;
}
case enter: {
prl(createComment("char is read like a number", C_SPEC));
}
case read: {
+ prl(createStartVar("tempa"));
prl("tempa := @String_To_Num(@Read_Line(Standard_Input_Port));");
prl(createToEStack("tempa"));
+ prl(createEndVar());
break;
}
}
case print: {
// TODO printing numbers needs different lengths of spacing
+ prl(createStartVar("tempa", "tempb"));
+
prl(createTopTwoEStack());
prl("Print_MJ(tempb,tempa);");
+ prl(createEndVar());
break;
}
op = get();
if (op >= 0)
if (wasJump)
- prl("SKIP END");
+ prl("SKIP\n END");
else
- prl("CALL a" + counter + " END");
+ prl("CALL a" + counter + "\n END");
}
- prl("\nSKIP END\nENDACTIONS;\n");
+ prl("SKIP\n END\nENDACTIONS;\n");
prl(createStandardEnd());
}