progs/compile.scala
changeset 690 8d57433c7b5e
parent 687 8865f4f2be59
child 695 484b74bc057e
equal deleted inserted replaced
689:d7c9ef381437 690:8d57433c7b5e
   117     def i(args: Any*): String = "   " ++ sc.s(args:_*) ++ "\n"
   117     def i(args: Any*): String = "   " ++ sc.s(args:_*) ++ "\n"
   118     def l(args: Any*): String = sc.s(args:_*) ++ ":\n"
   118     def l(args: Any*): String = sc.s(args:_*) ++ ":\n"
   119 }
   119 }
   120 
   120 
   121 // this allows you to write things like
   121 // this allows you to write things like
   122 // i"add" and l"Lable"
   122 // i"add" and l"Label"
   123 
   123 
   124 
   124 
   125 // environments 
   125 // environments 
   126 type Env = Map[String, Int]
   126 type Env = Map[String, Int]
   127 
   127 
   203 }
   203 }
   204 
   204 
   205 // main compilation function for blocks
   205 // main compilation function for blocks
   206 def compile(bl: Block, class_name: String) : String = {
   206 def compile(bl: Block, class_name: String) : String = {
   207   val instructions = compile_block(bl, Map.empty)._1
   207   val instructions = compile_block(bl, Map.empty)._1
   208   (beginning ++ instructions.mkString ++ ending).replaceAllLiterally("XXX", class_name)
   208   (beginning ++ instructions ++ ending).replaceAllLiterally("XXX", class_name)
   209 }
   209 }
   210 
   210 
   211 
   211 
   212 // compiling and running files
   212 // compiling and running files
   213 //
   213 //
   255 }
   255 }
   256 
   256 
   257 
   257 
   258 // Fibonacci numbers as a bare-bone test-case
   258 // Fibonacci numbers as a bare-bone test-case
   259 val fib_test = 
   259 val fib_test = 
   260   List(Assign("n", Num(10)),            //  n := 10;                     
   260   List(Assign("n", Num(9)),            //  n := 10;                     
   261        Assign("minus1",Num(0)),         //  minus1 := 0;
   261        Assign("minus1",Num(0)),         //  minus1 := 0;
   262        Assign("minus2",Num(1)),         //  minus2 := 1;
   262        Assign("minus2",Num(1)),         //  minus2 := 1;
   263        Assign("temp",Num(0)),           //  temp := 0;
   263        Assign("temp",Num(0)),           //  temp := 0;
   264        While(Bop("<",Num(0),Var("n")),  //  while n > 0 do  {
   264        While(Bop("<",Num(0),Var("n")),  //  while n > 0 do  {
   265           List(Assign("temp",Var("minus2")), //  temp := minus2;
   265           List(Assign("temp",Var("minus2")), //  temp := minus2;