gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
f43dfeb6ab8f714c34d2d73f5f98d4e751bd583c
[mjc2wsl.git] / mjc2wsl.java
1 import java.io.*;
2 import java.util.*;
4 /**
5 * This program converts file from compiled MicroJava bytecode (a subset used
6 * in Compiler Construction courses by H. Moessenboeck, not "Java ME")
7 * to WSL language which is a part of the FermaT Transformation system.
8 *
9 * @author Doni Pracner, http://perun.dmi.rs/pracner http://quemaster.com
10 */
11 public class mjc2wsl{
12 public static String versionN = "0.1";
14 //regular comments from the original file
15 //OC when original code is inserted in the file, next to the translations
16 //SPEC special messages from the translator
17 //ERR error messages from the transnlator
18 public static final char C_REG = ' ', C_OC = '#', C_SPEC = '&', C_ERR = '!';
21 /** instruction code */
22 public static final int
23 load = 1,
24 load_0 = 2,
25 load_1 = 3,
26 load_2 = 4,
27 load_3 = 5,
28 store = 6,
29 store_n = 7,
30 getstatic = 11,
31 putstatic = 12,
32 getfield = 13,
33 putfield = 14,
34 const_0 = 15,
35 const_1 = 16,
36 const_2 = 17,
37 const_3 = 18,
38 const_4 = 19,
39 const_5 = 20,
40 const_m1 = 21,
41 const_ = 22,
42 add = 23,
43 sub = 24,
44 mul = 25,
45 div = 26,
46 rem = 27,
47 neg = 28,
48 shl = 29,
49 shr = 30,
50 inc = 31,
51 new_ = 32,
52 newarray = 33,
53 aload = 34,
54 astore = 35,
55 baload = 36,
56 bastore = 37,
57 arraylength = 38,
58 pop = 39,
59 dup = 40,
60 dup2 = 41,
61 jmp = 42,
62 jcc = 43,
63 call = 49,
64 return_ = 50,
65 enter = 51,
66 exit = 52,
67 read = 53,
68 print = 54,
69 bread = 55,
70 bprint = 56,
71 trap = 57;
73 public String getStandardStart(){
74 String ret ="C:\" This file automatically converted from microjava bytecode\";\n"
75 +"C:\" with mjc2wsl v "+versionN+"\";\n";
76 ret +="VAR < tempa := 0, tempb := 0, tempres :=0,\n"+
77 " stack := < >, t_e_m_p := 0 > :\n";
79 return ret;
80 }
82 public String getStandardEnd(){
83 return "SKIP\nENDVAR";
84 }
86 private InputStream mainIn;
87 private PrintStream out = System.out;
89 private void pr(int i){
90 out.print(i);
91 }
93 private void pr(char i){
94 out.print(i);
95 }
97 private void pr(String i){
98 out.print(i);
99 }
101 private void prl(String i){
102 out.println(i);
105 private int get() {
106 int res = -1;
107 try{
108 res = mainIn.read();
109 if (res>=0) res = res<<24>>>24;
110 }catch (IOException ex){
111 ex.printStackTrace();
113 return res;
116 private int get2() {
117 return (get()*256 + get())<<16>>16;
120 private int get4() {
121 return (get2()<<16) + (get2()<<16>>>16);
124 /**
125 * Creates a WSL comment with care to quote chars.
126 */
127 public static String createComment(String str){
128 return createComment(str, C_REG);
131 /**
132 * Creates a WSL comment with care to quote chars, of the
133 * given type. Types are given as char constants. They can be
134 * default comments, comments that contain the original code
135 * in them, or additional comments regarding the translation
136 * process.
137 */
138 public static String createComment(String str, char type){
139 return "C:\""+type+str.replace("\"", "''")+"\";";
142 private String cmdToStack(int i){
143 return "stack := <"+i+" > ++ stack;";
146 private String cmdToStack(String i){
147 return "stack := <"+i+" > ++ stack;";
150 private String cmdFromStack(String st){
151 return st+" := HEAD(stack); stack := TAIL(stack);";
154 private String getTopTwo(){
155 return cmdFromStack("tempa")+cmdFromStack("tempb");
158 private String getTop(){
159 return cmdFromStack("tempa");
162 public void convertStream(InputStream ins){
163 mainIn = ins;
164 //skip start TODO make better
165 for (int i=0;i<14;i++) get();
167 prl(getStandardStart());
169 int op = get();
170 while (op>=0){
171 switch(op) {
172 case load: {
173 prl(cmdToStack(get()));
174 break;
176 case load_0: {
177 prl(cmdToStack(0));
178 break;
179 }
180 case const_: {
181 prl(cmdToStack(get4()));
182 break;
184 case const_0: {
185 prl(cmdToStack(0));
186 break;
188 case const_1: {
189 prl(cmdToStack(1));
190 break;
192 case const_2: {
193 prl(cmdToStack(2));
194 break;
196 case const_3: {
197 prl(cmdToStack(3));
198 break;
200 case const_4: {
201 prl(cmdToStack(4));
202 break;
205 case const_5: {
206 prl(cmdToStack(5));
207 break;
210 case div: {
211 prl(getTopTwo());
212 prl("tempr = tempa / tempb;");
213 prl(cmdToStack("tempr"));
214 break;
217 case enter: {
218 prl(createComment("enter"));
219 get();get();
220 break;
223 //the prints
224 case bprint: {
225 prl(getTop());
226 prl("PRINT(tempa);");
227 break;
229 case print: {
230 //TODO need to make it a char
231 prl(getTop());
232 prl("PRINT(tempa);");
233 break;
236 default: prl(createComment("unknown op error: "+op,C_ERR)); break;
238 op = get();
240 prl(getStandardEnd());
244 public void convertFile(File f){
245 try{
246 convertStream(new FileInputStream(f));
247 }catch (Exception ex){
248 ex.printStackTrace();
252 public void run(String[] args){
253 if (args.length == 0){
254 System.out.println("MicroJava bytecode to WSL converter. v "+versionN+", by Doni Pracner");
255 System.out.println("usage:\n\t mjc2wsl filename");
256 }else{
257 File f = new File(args[0]);
258 if (f.exists()){
259 Calendar now = Calendar.getInstance();
260 convertFile(f);
261 long mili = Calendar.getInstance().getTimeInMillis() - now.getTimeInMillis();
262 System.out.println("conversion time:"+mili+" ms");
263 }else
264 System.out.println("file does not exist");
268 public static void main(String[] args){
269 new mjc2wsl().run(args);
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner