progs/compile_arr.scala
changeset 696 3a5a7908517f
parent 695 484b74bc057e
child 707 2fcd7c2da729
equal deleted inserted replaced
695:484b74bc057e 696:3a5a7908517f
   443 
   443 
   444 def instrs(prog: String) : String =
   444 def instrs(prog: String) : String =
   445   prog.toList.map(instr).mkString
   445   prog.toList.map(instr).mkString
   446 
   446 
   447 
   447 
       
   448 // the mandelbrot.bf program is so large that
       
   449 // it does not fit into the limitations of what the
       
   450 // JVM imposes on methods.
       
   451 //
       
   452 // below it just about fits by optimising [-] loops
       
   453 // and combining instructions
       
   454 
   448 def splice(cs: List[Char], acc: List[(Char, Int)]) : List[(Char, Int)] = (cs, acc) match {
   455 def splice(cs: List[Char], acc: List[(Char, Int)]) : List[(Char, Int)] = (cs, acc) match {
   449   case (Nil, acc) => acc
   456   case (Nil, acc) => acc
   450   case (c :: cs, Nil) => splice(cs, List((c, 1)))
   457   case (c :: cs, Nil) => splice(cs, List((c, 1)))
   451   case (c :: cs, (d, n) :: acc) => 
   458   case (c :: cs, (d, n) :: acc) => 
   452     if (c == d) splice(cs, (c, n + 1) :: acc)
   459     if (c == d) splice(cs, (c, n + 1) :: acc)
   454 }
   461 }
   455 
   462 
   456 def spl(s: String) = splice(s.toList, Nil).reverse
   463 def spl(s: String) = splice(s.toList, Nil).reverse
   457 
   464 
   458 def instr2(c: Char, n: Int) : String = c match {
   465 def instr2(c: Char, n: Int) : String = c match {
   459   case '>' => "ptr := ptr + " + n.toString + ";"
   466   case '>' => s"ptr := ptr + $n;"
   460   case '<' => "ptr := ptr - " + n.toString + ";"
   467   case '<' => s"ptr := ptr - $n;"
   461   case '+' => "field[ptr] := field[ptr] + " + n.toString + ";"
   468   case '0' => s"field[ptr] := 0;"
   462   case '-' => "field[ptr] := field[ptr] - " + n.toString + ";"
   469   case '+' => s"field[ptr] := field[ptr] + $n;"
   463   case '.' => "x := field[ptr]; write x;" //* n
   470   case '-' => s"field[ptr] := field[ptr] - $n;"
   464   //case ',' => "*ptr = getchar();\n" * n
   471   case '.' => s"x := field[ptr]; write x;" 
   465   case '['  => "while (field[ptr] != 0) do {" * n 
   472   case '['  => "while (field[ptr] != 0) do {" * n 
   466   case ']'  => "skip};" * n
   473   case ']'  => "skip};" * n
   467   case _ => ""
   474   case _ => ""
   468 }
   475 }
   469 
   476 
   470 def instrs2(prog: String) : String =
   477 def instrs2(prog: String) : String =
   471   spl(prog).map{ case (c, n) => instr2(c, n) }.mkString
   478   spl(prog.replaceAll("""\[-\]""", "0")).map{ case (c, n) => instr2(c, n) }.mkString
   472 
       
   473 
   479 
   474 def bf_str(prog: String) : String = {
   480 def bf_str(prog: String) : String = {
   475   "\n" ++
   481   "\n" ++
   476   //"new field[30000];\n" ++
       
   477   "ptr := 15000;" ++
   482   "ptr := 15000;" ++
   478   instrs(prog) ++
   483   instrs2(prog) ++
   479   "skip"
   484   "skip"
   480 }
   485 }
   481 
   486 
   482 def bf_run(prog: String, name: String) = {
   487 def bf_run(prog: String, name: String) = {
   483   println("BF processing start")
   488   println("BF processing start")
   521       <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
   526       <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
   522       [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]"""
   527       [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]"""
   523 
   528 
   524 bf_run(bf2, "fibs")
   529 bf_run(bf2, "fibs")
   525 
   530 
   526 /*
       
   527 
   531 
   528 
   532 
   529 bf_run("""      A mandelbrot set fractal viewer in brainf*** written by Erik Bosman
   533 bf_run("""      A mandelbrot set fractal viewer in brainf*** written by Erik Bosman
   530 +++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[
   534 +++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[
   531 >>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+
   535 >>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+
   670 -<<[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>
   674 -<<[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>
   671 >>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<++++
   675 >>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<++++
   672 +[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<
   676 +[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<
   673 <<<<<]]>>>]""", "mand")
   677 <<<<<]]>>>]""", "mand")
   674 
   678 
   675 */
   679