equal
  deleted
  inserted
  replaced
  
    
    
|    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  |    121  | 
|    122 // environments  |    122 // environments  | 
|    123 type Env = Map[String, String] |    123 type Env = Map[String, Int] | 
|    124  |    124  | 
|    125 // arithmetic expression compilation |    125 // arithmetic expression compilation | 
|    126 def compile_aexp(a: AExp, env : Env) : String = a match { |    126 def compile_aexp(a: AExp, env : Env) : String = a match { | 
|    127   case Num(i) => i"ldc $i" |    127   case Num(i) => i"ldc $i" | 
|    128   case Var(s) => i"iload ${env(s)}" |    128   case Var(s) => i"iload ${env(s)}" | 
|    148  |    148  | 
|    149 // statement compilation |    149 // statement compilation | 
|    150 def compile_stmt(s: Stmt, env: Env) : (String, Env) = s match { |    150 def compile_stmt(s: Stmt, env: Env) : (String, Env) = s match { | 
|    151   case Skip => ("", env) |    151   case Skip => ("", env) | 
|    152   case Assign(x, a) => { |    152   case Assign(x, a) => { | 
|    153     val index = if (env.isDefinedAt(x)) env(x) else  |    153     val index = if (env.isDefinedAt(x)) env(x) else env.keys.size | 
|    154                     env.keys.size.toString |         | 
|    155     (compile_aexp(a, env) ++ i"istore $index", env + (x -> index)) |    154     (compile_aexp(a, env) ++ i"istore $index", env + (x -> index)) | 
|    156   }  |    155   }  | 
|    157   case If(b, bl1, bl2) => { |    156   case If(b, bl1, bl2) => { | 
|    158     val if_else = Fresh("If_else") |    157     val if_else = Fresh("If_else") | 
|    159     val if_end = Fresh("If_end") |    158     val if_end = Fresh("If_end") | 
|    178   } |    177   } | 
|    179   case Write(x) =>  |    178   case Write(x) =>  | 
|    180     (i"iload ${env(x)}" ++  |    179     (i"iload ${env(x)}" ++  | 
|    181      i"invokestatic XXX/XXX/write(I)V", env) |    180      i"invokestatic XXX/XXX/write(I)V", env) | 
|    182   case Read(x) => { |    181   case Read(x) => { | 
|    183     val index = if (env.isDefinedAt(x)) env(x) else  |    182     val index = if (env.isDefinedAt(x)) env(x) else env.keys.size | 
|    184                     env.keys.size.toString |         | 
|    185     (i"invokestatic XXX/XXX/read()I" ++  |    183     (i"invokestatic XXX/XXX/read()I" ++  | 
|    186      i"istore $index", env + (x -> index)) |    184      i"istore $index", env + (x -> index)) | 
|    187   } |    185   } | 
|    188 } |    186 } | 
|    189  |    187  |