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; |