gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: a24993c)
raw | patch | inline | side by side (parent: a24993c)
author | Doni Pracner <quinnuendo@gmail.com> | |
Fri, 31 Aug 2012 23:51:44 +0000 (01:51 +0200) | ||
committer | Doni Pracner <quinnuendo@gmail.com> | |
Fri, 31 Aug 2012 23:51:44 +0000 (01:51 +0200) |
mjc2wsl.java | patch | blob | history | |
samples/chrtest.wsl | [new file with mode: 0644] | patch | blob |
samples/sample0-h1.wsl | [new file with mode: 0644] | patch | blob |
samples/sample0.wsl | [new file with mode: 0644] | patch | blob |
diff --git a/mjc2wsl.java b/mjc2wsl.java
index f43dfeb6ab8f714c34d2d73f5f98d4e751bd583c..e65bd1dbbc33fd527f200677a2aad4addbedb9a6 100644 (file)
--- a/mjc2wsl.java
+++ b/mjc2wsl.java
load_2 = 4,
load_3 = 5,
store = 6,
- store_n = 7,
+ store_0 = 7,
+ store_1 = 8,
+ store_2 = 9,
+ store_3 = 10,
getstatic = 11,
putstatic = 12,
getfield = 13,
dup = 40,
dup2 = 41,
jmp = 42,
- jcc = 43,
+ jeq = 43,
+ jne = 44,
+ jlt = 45,
+ jle = 46,
+ jgt = 47,
+ jge = 48,
call = 49,
return_ = 50,
enter = 51,
trap = 57;
public String getStandardStart(){
- String ret ="C:\" This file automatically converted from microjava bytecode\";\n"
- +"C:\" with mjc2wsl v "+versionN+"\";\n";
- ret +="VAR < tempa := 0, tempb := 0, tempres :=0,\n"+
- " stack := < >, t_e_m_p := 0 > :\n";
+ StringBuilder ret = new StringBuilder("C:\" This file automatically converted from microjava bytecode\";\n"
+ +"C:\" with mjc2wsl v "+versionN+"\";\n");
- return ret;
+ ret.append("VAR < tempa := 0, tempb := 0, tempres :=0,\n");
+ for (int i=0;i<=3;i++) ret.append("loc"+i+" := 0, ");
+ ret.append("\n estack := < >, t_e_m_p := 0 > :");
+
+ return ret.toString();
}
public String getStandardEnd(){
return "SKIP\nENDVAR";
}
-
+
+ private boolean originalInComments = false;
+
private InputStream mainIn;
- private PrintStream out = System.out;
+ private PrintWriter out = null;
private void pr(int i){
out.print(i);
return (get2()<<16) + (get2()<<16>>>16);
}
+ private String loc(int i){
+ return "loc"+i;
+ }
+
/**
* Creates a WSL comment with care to quote chars.
*/
return "C:\""+type+str.replace("\"", "''")+"\";";
}
- private String cmdToStack(int i){
- return "stack := <"+i+" > ++ stack;";
+ private String cmdToEStack(int i){
+ return "estack := <"+i+" > ++ estack;";
}
- private String cmdToStack(String i){
- return "stack := <"+i+" > ++ stack;";
+ private String cmdToEStack(String i){
+ return "estack := <"+i+" > ++ estack;";
}
- private String cmdFromStack(String st){
- return st+" := HEAD(stack); stack := TAIL(stack);";
+ private String cmdFromEStack(String st){
+ return st+" := HEAD(estack); estack := TAIL(estack);";
}
private String getTopTwo(){
- return cmdFromStack("tempa")+cmdFromStack("tempb");
+ return cmdFromEStack("tempa")+"\n"+cmdFromEStack("tempb");
}
private String getTop(){
- return cmdFromStack("tempa");
+ return cmdFromEStack("tempa");
}
public void convertStream(InputStream ins){
int op = get();
while (op>=0){
+ if (originalInComments) prl(createComment(""+op,C_OC));
switch(op) {
case load: {
- prl(cmdToStack(get()));
+ prl(cmdToEStack(loc(get())));
break;
}
- case load_0: {
- prl(cmdToStack(0));
- break;
- }
- case const_: {
- prl(cmdToStack(get4()));
- break;
+ case load_0: case load_1: case load_2: case load_3: {
+ prl(cmdToEStack(loc(op-load_0)));
+ break;
}
- case const_0: {
- prl(cmdToStack(0));
+ case store: {
+ prl(cmdFromEStack(loc(get())));
break;
}
- case const_1: {
- prl(cmdToStack(1));
+ case store_0: case store_1: case store_2: case store_3: {
+ prl(cmdFromEStack(loc(op-store_0)));
break;
}
- case const_2: {
- prl(cmdToStack(2));
+ case const_: {
+ prl(cmdToEStack(get4()));
break;
}
- case const_3: {
- prl(cmdToStack(3));
+
+ case const_0: case const_1: case const_2:
+ case const_3: case const_4: case const_5:{
+ prl(cmdToEStack(op-const_0));
break;
}
- case const_4: {
- prl(cmdToStack(4));
- break;
+
+ case jmp: {
+ prl(createComment("CALL "+get2()));
+ break;
}
- case const_5: {
- prl(cmdToStack(5));
- break;
+ case jeq: case jne: case jlt:
+ case jle: case jgt: case jge: {
+ prl(getTopTwo());
+ prl(createComment("IF CALL "+get2()));
+ break;
}
+ case add: {
+ prl(getTopTwo());
+ prl("tempres := tempb + tempa;");
+ prl(cmdToEStack("tempres"));
+ break;
+ }
case div: {
prl(getTopTwo());
- prl("tempr = tempa / tempb;");
- prl(cmdToStack("tempr"));
+ prl("tempres := tempb / tempa;");
+ prl(cmdToEStack("tempres"));
break;
}
case enter: {
- prl(createComment("enter"));
+ prl(createComment("enter not fully procesed yet"));
get();get();
break;
}
+ case return_: {
+ prl(createComment("return not fully procesed yet"));
+ break;
+ }
+ case exit: {
+ prl(createComment("exit not fully procesed yet"));
+ break;
+ }
//the prints
case bprint: {
- prl(getTop());
- prl("PRINT(tempa);");
+ prl(getTopTwo());
+ prl("PRINT(tempb);");
break;
}
case print: {
//TODO need to make it a char
- prl(getTop());
- prl("PRINT(tempa);");
+ prl(getTopTwo());
+ prl("PRINT(tempb);");
break;
}
}
}
+ public void printHelp(){
+ System.out.println("MicroJava bytecode to WSL converter. v "+versionN+", by Doni Pracner");
+ System.out.println("usage:\n\t {options} mjc2wsl filename [outfile]");
+ System.out.println("options:\n\t--screen print output to screen");
+ System.out.println("\t-o --oc include original code in comments");
+ }
+
+ public String makeDefaultOutName(String inname){
+ String rez = inname;
+ if (inname.endsWith(".obj"))
+ rez = rez.substring(0,rez.length()-4);
+ return rez+".wsl";
+ }
+
public void run(String[] args){
if (args.length == 0){
- System.out.println("MicroJava bytecode to WSL converter. v "+versionN+", by Doni Pracner");
- System.out.println("usage:\n\t mjc2wsl filename");
+ printHelp();
}else{
- File f = new File(args[0]);
+ int i=0;
+ while (i<args.length && args[i].charAt(0)=='-'){
+ if (args[i].compareTo("-h")==0){
+ printHelp();return;
+ }else
+ if (args[i].compareTo("-o")==0 || args[i].startsWith("--oc")){
+ if (args[i].length()==2) originalInComments = true;
+ else if (args[i].length()==5)
+ originalInComments = args[i].charAt(4)=='+';
+ else originalInComments = true;
+ }else
+ if (args[i].startsWith("--screen")){
+ out = new PrintWriter(System.out);
+ }
+ i++;
+ }
+
+ if (i>=args.length) {System.out.println("no filename supplied");System.exit(2);}
+ File f = new File(args[i]);
+
+ if (i+1<args.length) {
+ try{out = new PrintWriter(args[i+1]);}catch (Exception e) {
+ System.err.println("error in opening out file:");
+ e.printStackTrace();
+ }
+ }
+ if (out == null){
+ //if not set to screen, or a file, make a default filename
+ try{out = new PrintWriter(makeDefaultOutName(args[i]));}catch (Exception e) {
+ System.err.println("error in opening out file:");
+ e.printStackTrace();
+ }
+ }
if (f.exists()){
Calendar now = Calendar.getInstance();
convertFile(f);
long mili = Calendar.getInstance().getTimeInMillis() - now.getTimeInMillis();
System.out.println("conversion time:"+mili+" ms");
+ out.close();
}else
System.out.println("file does not exist");
}
diff --git a/samples/chrtest.wsl b/samples/chrtest.wsl
--- /dev/null
+++ b/samples/chrtest.wsl
@@ -0,0 +1,36 @@
+C:" This file automatically converted from microjava bytecode";
+C:" with mjc2wsl v 0.1";
+VAR < tempa := 0, tempb := 0, tempres :=0,
+ stack := < >, t_e_m_p := 0 > :
+
+C:"#51";
+C:" enter";
+C:"#22";
+stack := <10 > ++ stack;
+C:"#22";
+stack := <15 > ++ stack;
+C:"#56";
+tempa := HEAD(stack); stack := TAIL(stack);
+PRINT(tempa);
+C:"#22";
+stack := <97 > ++ stack;
+C:"#20";
+stack := <5 > ++ stack;
+C:"#54";
+tempa := HEAD(stack); stack := TAIL(stack);
+PRINT(tempa);
+C:"#15";
+stack := <0 > ++ stack;
+C:"#38";
+C:"!unknown op error: 38";
+C:"#15";
+stack := <0 > ++ stack;
+C:"#54";
+tempa := HEAD(stack); stack := TAIL(stack);
+PRINT(tempa);
+C:"#52";
+C:"!unknown op error: 52";
+C:"#50";
+C:"!unknown op error: 50";
+SKIP
+ENDVAR
diff --git a/samples/sample0-h1.wsl b/samples/sample0-h1.wsl
--- /dev/null
+++ b/samples/sample0-h1.wsl
@@ -0,0 +1,41 @@
+C:" This file automatically converted from microjava bytecode";
+C:" with mjc2wsl v 0.1";
+VAR < tempa := 0, tempb := 0, tempres :=0,
+loc0 := 0, loc1 := 0, loc2 := 0, loc3 := 0,
+ estack := < >, t_e_m_p := 0 > :
+ ACTIONS A_S_start:
+ A_S_start ==
+
+C:" enter not fully procesed yet";
+estack := <0 > ++ estack;
+loc0 := HEAD(estack); estack := TAIL(estack);
+CALL a19 END
+a19 ==
+estack := <loc0 > ++ estack;
+estack := <5 > ++ estack;
+tempa := HEAD(estack); estack := TAIL(estack);
+tempb := HEAD(estack); estack := TAIL(estack);
+C:" IF CALL 13";
+IF tempb >= tempa THEN CALL a34 FI;
+estack := <loc0 > ++ estack;
+estack := <0 > ++ estack;
+tempa := HEAD(estack); estack := TAIL(estack);
+tempa := HEAD(estack); estack := TAIL(estack);
+PRINT(tempa);
+estack := <loc0 > ++ estack;
+estack := <1 > ++ estack;
+tempa := HEAD(estack); estack := TAIL(estack);
+tempb := HEAD(estack); estack := TAIL(estack);
+tempres := tempb + tempa;
+estack := <tempres > ++ estack;
+loc0 := HEAD(estack); estack := TAIL(estack);
+C:" CALL -12";
+CALL a19 END
+a34 ==
+C:" exit not fully procesed yet";
+C:" return not fully procesed yet";
+CALL Z
+END
+ENDACTIONS;
+SKIP
+ENDVAR
diff --git a/samples/sample0.wsl b/samples/sample0.wsl
--- /dev/null
+++ b/samples/sample0.wsl
@@ -0,0 +1,41 @@
+C:" This file automatically converted from microjava bytecode";
+C:" with mjc2wsl v 0.1";
+VAR < tempa := 0, tempb := 0, tempres :=0,
+loc0 := 0, loc1 := 0, loc2 := 0, loc3 := 0,
+ estack := < >, t_e_m_p := 0 > :
+ ACTIONS A_S_start:
+ A_S_start ==
+
+C:" enter not fully procesed yet";
+estack := <0 > ++ estack;
+loc0 := HEAD(estack); estack := TAIL(estack);
+CALL a19 END
+a19 ==
+estack := <loc0 > ++ estack;
+estack := <5 > ++ estack;
+tempa := HEAD(estack); estack := TAIL(estack);
+tempb := HEAD(estack); estack := TAIL(estack);
+C:" IF CALL 13";
+IF tempb >= tempa THEN CALL a34 FI;
+estack := <loc0 > ++ estack;
+estack := <0 > ++ estack;
+tempa := HEAD(estack); estack := TAIL(estack);
+tempa := HEAD(estack); estack := TAIL(estack);
+PRINT(tempa);
+estack := <loc0 > ++ estack;
+estack := <1 > ++ estack;
+tempa := HEAD(estack); estack := TAIL(estack);
+tempb := HEAD(estack); estack := TAIL(estack);
+tempres := tempb + tempa;
+estack := <tempres > ++ estack;
+loc0 := HEAD(estack); estack := TAIL(estack);
+C:" CALL -12";
+CALL a19 END
+a34 ==
+C:" exit not fully procesed yet";
+C:" return not fully procesed yet";
+CALL Z
+END
+ENDACTIONS;
+SKIP
+ENDVAR