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 = { |