equal
deleted
inserted
replaced
23 // under ammonite. |
23 // under ammonite. |
24 |
24 |
25 // compile_arrays.sc (no peephole optimisations) |
25 // compile_arrays.sc (no peephole optimisations) |
26 // compile_arrays2.sc (peephole optimisations applied) |
26 // compile_arrays2.sc (peephole optimisations applied) |
27 |
27 |
28 //> using file compile_arrays.sc |
28 //> using file compile_arrays2.sc |
29 import compile_arrays.* |
29 import compile_arrays2.* |
30 |
30 |
31 def time_needed[T](i: Int, code: => T) = { |
31 def time_needed[T](i: Int, code: => T) = { |
32 val start = System.nanoTime() |
32 val start = System.nanoTime() |
33 for (j <- 2 to i) code |
33 for (j <- 2 to i) code |
34 val result = code |
34 val result = code |
190 case '+' => "mem[ptr] := mem[ptr] + 1;" |
190 case '+' => "mem[ptr] := mem[ptr] + 1;" |
191 case '-' => "mem[ptr] := mem[ptr] - 1;" |
191 case '-' => "mem[ptr] := mem[ptr] - 1;" |
192 case '.' => "x := mem[ptr]; write x;" |
192 case '.' => "x := mem[ptr]; write x;" |
193 case '[' => "while (mem[ptr] != 0) do {" |
193 case '[' => "while (mem[ptr] != 0) do {" |
194 case ']' => "skip};" |
194 case ']' => "skip};" |
|
195 case '0' => "mem[ptr] := 0;" |
195 case _ => "" |
196 case _ => "" |
196 } |
197 } |
197 |
198 |
198 def instrs(prog: String) : String = |
199 def instrs(prog: String) : String = |
199 prog.toList.map(instr).mkString |
200 prog.toList.map(instr).mkString |
247 |
248 |
248 |
249 |
249 def bf_run(prog: String, name: String) = { |
250 def bf_run(prog: String, name: String) = { |
250 println(s"BF pre-processing of $name") |
251 println(s"BF pre-processing of $name") |
251 val bf_string = bf_str(prog) |
252 val bf_string = bf_str(prog) |
|
253 os.write.over(os.pwd / s"$name.while", bf_string) |
252 println(s"BF parsing (program length ${bf_string.length} characters)") |
254 println(s"BF parsing (program length ${bf_string.length} characters)") |
253 val (time, bf_prog) = |
255 val (time, bf_prog) = |
254 time_needed(1, fastparse.parse(bf_string, implicit p => Stmts).get.value) |
256 time_needed(1, fastparse.parse(bf_string, implicit p => Stmts).get.value) |
255 println(s"BF generated WHILE program (needed $time secs for parsing)") |
257 println(s"BF generated WHILE program (needed $time secs for parsing)") |
256 compile_and_run(bf_prog, name) |
258 compile_and_run(bf_prog, name) |
318 //@doc(" All benchmarks.") |
320 //@doc(" All benchmarks.") |
319 //@main |
321 //@main |
320 def all() = { bfc0(); bfc1(); bfc2(); bfc3(); bfc4() } |
322 def all() = { bfc0(); bfc1(); bfc2(); bfc3(); bfc4() } |
321 |
323 |
322 //all() |
324 //all() |
323 bfc4() |
325 //bfc4() |
324 |
326 |
325 |
327 def donut() = bf_run(read(pwd / "donut.bf"), "donut") |
326 |
328 donut() |
327 |
329 |
328 // old way to run it with Ammonite |
330 // old way to run it with Ammonite |
329 // |
331 // |
330 // Call with (X being 0,1,..,4) |
332 // Call with (X being 0,1,..,4) |
331 // |
333 // |