progs/compile_arr.scala
changeset 612 7a12053567d4
parent 611 060f33b5661d
child 616 24bbe4e4b37b
equal deleted inserted replaced
611:060f33b5661d 612:7a12053567d4
    10 // statements
    10 // statements
    11 case object Skip extends Stmt
    11 case object Skip extends Stmt
    12 case class If(a: BExp, bl1: Block, bl2: Block) extends Stmt
    12 case class If(a: BExp, bl1: Block, bl2: Block) extends Stmt
    13 case class While(b: BExp, bl: Block) extends Stmt
    13 case class While(b: BExp, bl: Block) extends Stmt
    14 case class Assign(s: String, a: AExp) extends Stmt
    14 case class Assign(s: String, a: AExp) extends Stmt
       
    15 case class AssignA(s: String, a1: AExp, a2: AExp) extends Stmt
    15 case class Write(s: String) extends Stmt  // writes out a variable
    16 case class Write(s: String) extends Stmt  // writes out a variable
       
    17 case class Array(s: String, n: Int) extends Stmt 
    16 
    18 
    17 // arithmetic expressions
    19 // arithmetic expressions
    18 case class Var(s: String) extends AExp
    20 case class Var(s: String) extends AExp
    19 case class Num(i: Int) extends AExp
    21 case class Num(i: Int) extends AExp
    20 case class Aop(o: String, a1: AExp, a2: AExp) extends AExp
    22 case class Aop(o: String, a1: AExp, a2: AExp) extends AExp
       
    23 case class Ref(s: String, a1: AExp) extends AExp
    21 
    24 
    22 // boolean expressions
    25 // boolean expressions
    23 case object True extends BExp
    26 case object True extends BExp
    24 case object False extends BExp
    27 case object False extends BExp
    25 case class Bop(o: String, a1: AExp, a2: AExp) extends BExp
    28 case class Bop(o: String, a1: AExp, a2: AExp) extends BExp
   134      List("\n" + loop_end + ":\n\n"), env1)
   137      List("\n" + loop_end + ":\n\n"), env1)
   135   }
   138   }
   136   case Write(x) => 
   139   case Write(x) => 
   137     (List("iload " + env(x) + "\n" + 
   140     (List("iload " + env(x) + "\n" + 
   138            "invokestatic XXX/XXX/write(I)V\n"), env)
   141            "invokestatic XXX/XXX/write(I)V\n"), env)
       
   142   case Array(s, n) => {
       
   143     val index = if (env.isDefinedAt(s)) throw new Exception("Array already defined") else 
       
   144                     env.keys.size.toString
       
   145     (List("ldc " ++ n.toString ++ "\n",
       
   146           "newarray int \n",
       
   147           "astore " ++ index ++ "\n"), env + (s -> index))
       
   148   } 
       
   149   case AssignA(s, a1, a2) => {
       
   150     val index = if (env.isDefinedAt(s)) env(s) else 
       
   151                     throw new Exception("Array not yet defined")
       
   152     (List("aload " + index) ++
       
   153      compile_aexp(a1, env) ++
       
   154      compile_aexp(a2, env) ++
       
   155      List("iastore"), env)
       
   156       
       
   157       compile_aexp(a, env) ++ 
       
   158      List("istore " + index + "\n"), env + (x -> index))
       
   159   } 
   139 }
   160 }
   140 
   161 
   141 // compilation of a block (i.e. list of instructions)
   162 // compilation of a block (i.e. list of instructions)
   142 def compile_block(bl: Block, env: Env) : (Instrs, Env) = bl match {
   163 def compile_block(bl: Block, env: Env) : (Instrs, Env) = bl match {
   143   case Nil => (Nil, env)
   164   case Nil => (Nil, env)
   215        Write("minus1"))                 //  write minus1
   236        Write("minus1"))                 //  write minus1
   216 
   237 
   217 
   238 
   218 compile_run(fib_test, "fib")
   239 compile_run(fib_test, "fib")
   219 
   240 
       
   241 val arr_test = 
       
   242   List(Assign("x", Num(0)),
       
   243        Array("a", 10))   
       
   244 
       
   245 compile_block(arr_test, Map())._1.mkString
       
   246 compile_run(arr_test, "arr")
   220 
   247 
   221 
   248 
   222 val arr_test = 
   249 val arr_test = 
   223   List(Array("a", 10),
   250   List(Array("a", 10),
   224        Array("b", 2),
   251        Array("b", 2),