progs/while-arrays/compile_arrays2.sc
changeset 948 a8a0f5f1cb75
parent 942 7f52427568ff
equal deleted inserted replaced
947:4d787a8b79a6 948:a8a0f5f1cb75
    10 //
    10 //
    11 // amm compile_arrays.sc
    11 // amm compile_arrays.sc
    12   
    12   
    13 
    13 
    14 // the abstract syntax trees for WHILE
    14 // the abstract syntax trees for WHILE
       
    15 
       
    16 //> using toolkit latest
    15 
    17 
    16 abstract class Stmt
    18 abstract class Stmt
    17 abstract class AExp
    19 abstract class AExp
    18 abstract class BExp 
    20 abstract class BExp 
    19 type Block = List[Stmt]
    21 type Block = List[Stmt]
   145 // statement compilation
   147 // statement compilation
   146 def compile_stmt(s: Stmt, env: Env) : (String, Env) = s match {
   148 def compile_stmt(s: Stmt, env: Env) : (String, Env) = s match {
   147   case Skip => ("", env)
   149   case Skip => ("", env)
   148   case Assign(x, a) => {
   150   case Assign(x, a) => {
   149      val index = env.getOrElse(x, env.keys.size)
   151      val index = env.getOrElse(x, env.keys.size)
   150     (compile_aexp(a, env) ++ compile_istore(index), env + (x -> index)) 
   152      (compile_aexp(a, env) ++ compile_istore(index), env + (x -> index)) 
   151   } 
   153   } 
   152   case If(b, bl1, bl2) => {
   154   case If(b, bl1, bl2) => {
   153     val if_else = Fresh("If_else")
   155     val if_else = Fresh("If_else")
   154     val if_end = Fresh("If_end")
   156     val if_end = Fresh("If_end")
   155     val (instrs1, env1) = compile_block(bl1, env)
   157     val (instrs1, env1) = compile_block(bl1, env)
   242 // post 2.5.0 ammonite
   244 // post 2.5.0 ammonite
   243 import os._
   245 import os._
   244 
   246 
   245 
   247 
   246 def compile_to_file(bl: Block, class_name: String) : Unit = 
   248 def compile_to_file(bl: Block, class_name: String) : Unit = 
   247   write.over(pwd / s"$class_name.j", compile(bl, class_name))  
   249   os.write.over(os.pwd / s"$class_name.j", compile(bl, class_name))  
   248 
   250 
   249 def compile_and_run(bl: Block, class_name: String) : Unit = {
   251 def compile_and_run(bl: Block, class_name: String) : Unit = {
   250   println(s"Start of compilation")
   252   println(s"Start of compilation")
   251   compile_to_file(bl, class_name)
   253   compile_to_file(bl, class_name)
   252   println(s"generated $class_name.j file")
   254   println(s"generated $class_name.j file")
   257   println(s"done.")
   259   println(s"done.")
   258 }
   260 }
   259 
   261 
   260 
   262 
   261    
   263    
   262 @main def main() = {
   264 //@main def main() = {
   263   compile_and_run(array_test, "arr")
   265 //  compile_and_run(array_test, "arr")
   264 }
   266 //}
   265 
   267 
   266 
   268 
   267 
   269 
   268 
   270