equal
deleted
inserted
replaced
5 // |
5 // |
6 // Call with |
6 // Call with |
7 // |
7 // |
8 // amm compile_arrays.sc |
8 // amm compile_arrays.sc |
9 |
9 |
10 //> using toolkit latest |
10 //> using toolkit 0.6.0 |
11 |
11 |
12 |
12 |
13 // the abstract syntax trees for WHILE |
13 // the abstract syntax trees for WHILE |
14 |
14 |
15 abstract class Stmt |
15 abstract class Stmt |
88 type Env = Map[String, Int] |
88 type Env = Map[String, Int] |
89 |
89 |
90 // convenient string interpolations |
90 // convenient string interpolations |
91 // for generating instructions and labels |
91 // for generating instructions and labels |
92 |
92 |
|
93 |
93 extension (sc: StringContext) { |
94 extension (sc: StringContext) { |
94 def i(args: Any*): String = " " ++ sc.s(args:_*) ++ "\n" |
95 def i(args: Any*): String = " " ++ sc.s(args*) ++ "\n" |
95 def l(args: Any*): String = sc.s(args:_*) ++ ":\n" |
96 def l(args: Any*): String = sc.s(args*) ++ ":\n" |
96 } |
97 } |
97 |
98 |
98 |
99 |
99 def compile_op(op: String) = op match { |
100 def compile_op(op: String) = op match { |
100 case "+" => i"iadd" |
101 case "+" => i"iadd" |
126 |
127 |
127 // statement compilation |
128 // statement compilation |
128 def compile_stmt(s: Stmt, env: Env) : (String, Env) = s match { |
129 def compile_stmt(s: Stmt, env: Env) : (String, Env) = s match { |
129 case Skip => ("", env) |
130 case Skip => ("", env) |
130 case Assign(x, a) => { |
131 case Assign(x, a) => { |
131 val index = env.getOrElse(x, env.keys.size) |
132 val index = env.getOrElse(x, env.keys.size) |
132 (compile_aexp(a, env) ++ i"istore $index \t\t; $x", env + (x -> index)) |
133 (compile_aexp(a, env) ++ i"istore $index \t\t; $x", env + (x -> index)) |
133 } |
134 } |
134 case If(b, bl1, bl2) => { |
135 case If(b, bl1, bl2) => { |
135 val if_else = Fresh("If_else") |
136 val if_else = Fresh("If_else") |
136 val if_end = Fresh("If_end") |
137 val if_end = Fresh("If_end") |
216 // |
217 // |
217 // java arr/arr |
218 // java arr/arr |
218 |
219 |
219 // automating the above |
220 // automating the above |
220 |
221 |
221 import os._ |
222 import os.* |
222 |
223 |
223 def compile_to_file(bl: Block, class_name: String) : Unit = |
224 def compile_to_file(bl: Block, class_name: String) : Unit = |
224 write.over(pwd / s"$class_name.j", compile(bl, class_name)) |
225 write.over(pwd / s"$class_name.j", compile(bl, class_name)) |
225 |
226 |
226 def compile_and_run(bl: Block, class_name: String) : Unit = { |
227 def compile_and_run(bl: Block, class_name: String) : Unit = { |