|    120  |    120  | 
|    121  |    121  | 
|    122 // environments  |    122 // environments  | 
|    123 type Env = Map[String, Int] |    123 type Env = Map[String, Int] | 
|    124  |    124  | 
|         |    125  | 
|         |    126 def compile_op(op: String) = op match { | 
|         |    127   case "+" => i"iadd" | 
|         |    128   case "-" => i"isub" | 
|         |    129   case "*" => i"imul" | 
|         |    130 } | 
|         |    131  | 
|    125 // arithmetic expression compilation |    132 // arithmetic expression compilation | 
|    126 def compile_aexp(a: AExp, env : Env) : String = a match { |    133 def compile_aexp(a: AExp, env : Env) : String = a match { | 
|    127   case Num(i) => i"ldc $i" |    134   case Num(i) => i"ldc $i" | 
|    128   case Var(s) => i"iload ${env(s)}" |    135   case Var(s) => i"iload ${env(s)}" | 
|    129   case Aop("+", a1, a2) =>  |    136   case Aop(op, a1, a2) =>  | 
|    130     compile_aexp(a1, env) ++ compile_aexp(a2, env) ++ i"iadd" |    137     compile_aexp(a1, env) ++ compile_aexp(a2, env) ++ compile_op(op) | 
|    131   case Aop("-", a1, a2) =>  |         | 
|    132     compile_aexp(a1, env) ++ compile_aexp(a2, env) ++ i"isub" |         | 
|    133   case Aop("*", a1, a2) =>  |         | 
|    134     compile_aexp(a1, env) ++ compile_aexp(a2, env) ++ i"imul" |         | 
|    135 } |    138 } | 
|    136  |    139  | 
|    137 // boolean expression compilation |    140 // boolean expression compilation | 
|    138 def compile_bexp(b: BExp, env : Env, jmp: String) : String = b match { |    141 def compile_bexp(b: BExp, env : Env, jmp: String) : String = b match { | 
|    139   case True => "" |    142   case True => "" | 
|    246   println("running") |    249   println("running") | 
|    247   println("Time: " + time_needed(1, ("java " + class_name + "/" + class_name).!)) |    250   println("Time: " + time_needed(1, ("java " + class_name + "/" + class_name).!)) | 
|    248 } |    251 } | 
|    249  |    252  | 
|    250  |    253  | 
|    251 // Fibonacci numbers as a test-case |    254 // Fibonacci numbers as a bare-bone test-case | 
|    252 val fib_test =  |    255 val fib_test =  | 
|    253   List(Assign("n", Num(10)),            //  n := 10;                      |    256   List(Assign("n", Num(10)),            //  n := 10;                      | 
|    254        Assign("minus1",Num(0)),         //  minus1 := 0; |    257        Assign("minus1",Num(0)),         //  minus1 := 0; | 
|    255        Assign("minus2",Num(1)),         //  minus2 := 1; |    258        Assign("minus2",Num(1)),         //  minus2 := 1; | 
|    256        Assign("temp",Num(0)),           //  temp := 0; |    259        Assign("temp",Num(0)),           //  temp := 0; |