-(* L2 Compiler
+(* L3 Compiler
* IR Trees
* Author: Kaustuv Chaudhuri <kaustuv+@cs.cmu.edu>
* Modified: Alex Vaynberg <alv@andrew.cmu.edu>
* Modified: Frank Pfenning <fp@cs.cmu.edu>
+ * Modified: Joshua Wise <jwise>
+ * Modified: Chris Lu <czl>
*)
signature TREE =
datatype binop = ADD | SUB | MUL | DIV | MOD | LSH | RSH | LOGOR | LOGAND | BITOR | BITAND | BITXOR | NEQ | EQ | LT | GT | LE | GE
datatype unop = NEG | BITNOT | BANG
+ type Blarg = int
+
datatype exp =
CONST of Word32.word
| TEMP of Temp.temp
+ | ARG of Blarg (* I am j4cbo *)
| BINOP of binop * exp * exp
| UNOP of unop * exp
+ | CALL of Ast.ident * exp list
and stm =
MOVE of exp * exp
| RETURN of exp
| LABEL of Label.label
| JUMPIFN of exp * Label.label
| JUMP of Label.label
+ and func =
+ FUNCTION of Ast.ident * stm list
- type program = stm list
+ type program = func list
structure Print :
sig
datatype binop = ADD | SUB | MUL | DIV | MOD | LSH | RSH | LOGOR | LOGAND | BITOR | BITAND | BITXOR | NEQ | EQ | LT | GT | LE | GE
datatype unop = NEG | BITNOT | BANG
+ type Blarg = int
+
datatype exp =
CONST of Word32.word
| TEMP of Temp.temp
+ | ARG of Blarg
| BINOP of binop * exp * exp
| UNOP of unop * exp
+ | CALL of Ast.ident * exp list
and stm =
MOVE of exp * exp
| RETURN of exp
| LABEL of Label.label
| JUMPIFN of exp * Label.label
| JUMP of Label.label
+ and func =
+ FUNCTION of Ast.ident * stm list
- type program = stm list
+ type program = func list
structure Print =
struct
+ exception Aaaasssssss
+
fun pp_binop ADD = "+"
| pp_binop SUB = "-"
| pp_binop MUL = "*"
fun pp_exp (CONST(x)) = Word32Signed.toString x
| pp_exp (TEMP(t)) = Temp.name t
+ | pp_exp (ARG(n)) = "arg#"^Int.toString n
| pp_exp (BINOP (binop, e1, e2)) =
"(" ^ pp_exp e1 ^ " " ^ pp_binop binop ^ " " ^ pp_exp e2 ^ ")"
| pp_exp (UNOP (unop, e1)) =
pp_unop unop ^ "(" ^ pp_exp e1 ^ ")"
+ | pp_exp (CALL (f, l)) =
+ Symbol.name f ^ "(" ^ (String.concatWith ", " (List.map pp_exp l)) ^ ")"
fun pp_stm (MOVE (e1,e2)) =
pp_exp e1 ^ " <-- " ^ pp_exp e2
"jump "^Label.name l^" if! "^pp_exp e
fun pp_program (nil) = ""
- | pp_program (stm::stms) = pp_stm stm ^ "\n" ^ pp_program stms
+ | pp_program (FUNCTION(id, stms)::funcs) =
+ (Symbol.name id) ^
+ "\n{\n" ^
+ (foldr (fn (a,b) => (pp_stm a) ^ "\n" ^ b) "" stms) ^
+ "}\n" ^
+ pp_program funcs
end
end