-(* L1 Compiler
+(* L2 Compiler
* Abstract Syntax Trees
* Author: Alex Vaynberg
* Modified: Frank Pfenning <fp@cs.cmu.edu>
+ * Modified: Joshua Wise <jwise@andrew.cmu.edu>
+ * Modified: Chris Lu <czl@andrew.cmu.edu>
*
* Uses pretty printing library
* structure PP -- see util/pp.sml
| DIVIDEDBY
| MODULO
| NEGATIVE (* unary minus *)
+ | LSH
+ | RSH
+ | LOGOR
+ | LOGAND
+ | BITAND
+ | BITXOR
+ | BITOR
+ | BITNOT
+ | BANG (* logical not *)
+ | NEQ
+ | EQ
+ | LT
+ | LE
+ | GE
+ | GT
datatype exp =
Var of ident
| ConstExp of Word32.word
| OpExp of oper * exp list
- | Marked of exp Mark.marked
+ | Marked of (* Kane *) exp Mark.marked
and stm =
Assign of ident * exp
| Return of exp
+ | Nop
+ | Break
+ | Continue
+ | If of exp * stm list * stm list option
+ | For of stm option * exp * stm option * stm list
+ | While of exp * stm list
+ | MarkedStm of stm Mark.marked
type program = stm list
| DIVIDEDBY
| MODULO
| NEGATIVE (* unary minus *)
+ | LSH
+ | RSH
+ | LOGOR
+ | LOGAND
+ | BITAND
+ | BITXOR
+ | BITOR
+ | BITNOT
+ | BANG
+ | NEQ
+ | EQ
+ | LT
+ | LE
+ | GE
+ | GT
datatype exp =
Var of ident
| Marked of exp Mark.marked
and stm =
Assign of ident * exp
- | Return of exp
+ | Return of exp
+ | Nop
+ | Break
+ | Continue
+ | If of exp * stm list * stm list option
+ | For of stm option * exp * stm option * stm list
+ | While of exp * stm list
+ | MarkedStm of stm Mark.marked
type program = stm list
| pp_oper DIVIDEDBY = "/"
| pp_oper MODULO = "%"
| pp_oper NEGATIVE = "-"
+ | pp_oper LSH = "<<"
+ | pp_oper RSH = ">>"
+ | pp_oper LOGAND = "&&"
+ | pp_oper LOGOR = "||"
+ | pp_oper BITAND = "&"
+ | pp_oper BITXOR = "^"
+ | pp_oper BITOR = "|"
+ | pp_oper BITNOT = "~"
+ | pp_oper BANG = "!"
+ | pp_oper NEQ = "!="
+ | pp_oper EQ = "=="
+ | pp_oper LT = "<"
+ | pp_oper LE = "<="
+ | pp_oper GT = ">"
+ | pp_oper GE = ">="
fun pp_exp (Var(id)) = pp_ident id
| pp_exp (ConstExp(c)) = Word32Signed.toString c
| pp_exp (OpExp(oper, [e1,e2])) =
"(" ^ pp_exp e1 ^ " " ^ pp_oper oper
^ " " ^ pp_exp e2 ^ ")"
+ | pp_exp (OpExp(oper, _)) =
+ pp_oper oper
| pp_exp (Marked(marked_exp)) =
pp_exp (Mark.data marked_exp)
pp_ident id ^ " = " ^ pp_exp e ^ ";"
| pp_stm (Return e) =
"return " ^ pp_exp e ^ ";"
+ | pp_stm Nop = ";"
+ | pp_stm Break = "break;"
+ | pp_stm Continue = "continue;"
+ | pp_stm (If (e, s, NONE)) = "if ("^pp_exp e^")"^pp_block s
+ | pp_stm (If (e, s, SOME s2)) = "if ("^pp_exp e^")"^pp_block s^" else "^pp_block s2
+ | pp_stm (While (e, s)) = "while ("^pp_exp e^") "^pp_block s
+ | pp_stm (For (so1, e, so2, s)) = "for ("^ (if (isSome so1) then pp_stm (valOf so1) else "") ^ pp_exp e ^ (if(isSome so2) then pp_stm (valOf so2) else "") ^ ")" ^ pp_block s
+ | pp_stm (MarkedStm m) = pp_stm (Mark.data m)
+
+ and pp_block (nil) = ";"
+ | pp_block (a::nil) = pp_stm a
+ | pp_block (l) = let
+ val contents = map pp_stm l
+ in
+ "{" ^ String.concat contents ^ "}"
+ end
fun pp_stms nil = ""
| pp_stms (s::ss) = pp_stm s ^ "\n" ^ pp_stms ss