X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/12aa4087bee3e70f170d7457794921de4e385227..a644da892dbd55a7be1aed029dafebe28d26d27e:/parse/ast.sml?ds=sidebyside diff --git a/parse/ast.sml b/parse/ast.sml index bd121e1..9645f6a 100644 --- a/parse/ast.sml +++ b/parse/ast.sml @@ -1,7 +1,9 @@ -(* L1 Compiler +(* L3 Compiler * Abstract Syntax Trees * Author: Alex Vaynberg * Modified: Frank Pfenning + * Modified: Joshua Wise + * Modified: Chris Lu * * Uses pretty printing library * structure PP -- see util/pp.sml @@ -10,7 +12,7 @@ signature AST = sig type ident = Symbol.symbol - + datatype oper = PLUS | MINUS @@ -18,17 +20,57 @@ sig | 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 + | Cast of Type.vtype * exp | ConstExp of Word32.word + | StringExp of string | OpExp of oper * exp list - | Marked of exp Mark.marked + | Marked of (* Kane *) exp Mark.marked + | FuncCall of ident * (exp list) + | Member of exp * ident + | DerefMember of exp * ident + | Dereference of exp + | ArrIndex of exp * exp + | New of Type.vtype + | NewArr of Type.vtype * exp + | Null + | Conditional of exp * exp * exp and stm = - Assign of ident * exp + Assign of exp * exp + | AsnOp of oper * exp * exp + | Effect of exp (* Just side effect the expression *) | Return of exp - - type program = stm list + | 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 + + datatype function = + Extern of Type.vtype * (Type.variable list) + | Function of Type.vtype * (Type.variable list) * (Type.variable list) * stm list + | MarkedFunction of function Mark.marked + + type program = Type.typedef Symbol.table * function Symbol.table (* print as source, with redundant parentheses *) structure Print : @@ -37,7 +79,6 @@ sig val pp_stm : stm -> string val pp_program : program -> string end - end structure Ast :> AST = @@ -51,17 +92,57 @@ struct | 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 + | Cast of Type.vtype * exp | ConstExp of Word32.word + | StringExp of string | OpExp of oper * exp list | Marked of exp Mark.marked + | FuncCall of ident * (exp list) + | Member of exp * ident + | DerefMember of exp * ident + | Dereference of exp + | ArrIndex of exp * exp + | New of Type.vtype + | NewArr of Type.vtype * exp + | Null + | Conditional of exp * exp * exp and stm = - Assign of ident * exp - | Return of exp - - type program = stm list + Assign of exp * exp + | AsnOp of oper * exp * exp + | Effect of exp (* Just side effect the expression *) + | 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 + + datatype function = + Extern of Type.vtype * (Type.variable list) + | Function of Type.vtype * (Type.variable list) * (Type.variable list) * stm list + | MarkedFunction of function Mark.marked + + type program = Type.typedef Symbol.table * function Symbol.table (* print programs and expressions in source form * using redundant parentheses to clarify precedence @@ -76,25 +157,88 @@ struct | 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 (Cast(ty, exp)) = "["^(Type.Print.pp_type ty)^"]"^(pp_exp exp) | pp_exp (ConstExp(c)) = Word32Signed.toString c + | pp_exp (StringExp(s)) = "\"" ^ s ^ "\"" | pp_exp (OpExp(oper, [e])) = pp_oper oper ^ "(" ^ pp_exp e ^ ")" | pp_exp (OpExp(oper, [e1,e2])) = "(" ^ pp_exp e1 ^ " " ^ pp_oper oper ^ " " ^ pp_exp e2 ^ ")" + | pp_exp (OpExp(oper, _)) = + pp_oper oper + | pp_exp (FuncCall(id, l)) = pp_ident id ^ "(" ^ pp_expl l ^ ")" | pp_exp (Marked(marked_exp)) = pp_exp (Mark.data marked_exp) - - fun pp_stm (Assign (id,e)) = - pp_ident id ^ " = " ^ pp_exp e ^ ";" + | pp_exp (Member(e, i)) = pp_exp e ^ "." ^ pp_ident i + | pp_exp (DerefMember(e, i)) = pp_exp e ^ "->" ^ pp_ident i + | pp_exp (Dereference(e)) = "*(" ^ pp_exp e ^ ")" + | pp_exp (ArrIndex(e1, e2)) = pp_exp e1 ^ "[" ^pp_exp e2 ^ "]" + | pp_exp (New t) = "new(" ^ Type.Print.pp_type t ^ ")" + | pp_exp (NewArr (t, s)) = "new(" ^ Type.Print.pp_type t ^ "[" ^ pp_exp s ^ "])" + | pp_exp Null = "NULL" + | pp_exp (Conditional (q, e1, e2)) = "("^(pp_exp q)^"?"^(pp_exp e1)^":"^(pp_exp e2)^")" + + and pp_expl nil = "" + | pp_expl (e::a::l) = (pp_exp e) ^ ", " ^ (pp_expl (a::l)) + | pp_expl (e::l) = (pp_exp e) ^ (pp_expl l) + + and pp_stm (Assign (e1,e2)) = + pp_exp e1 ^ " = " ^ pp_exp e2 ^ ";\n" + | pp_stm (AsnOp (oop, e1, e2)) = + pp_exp e1 ^ " " ^ pp_oper oop ^ "= " ^ pp_exp e2 ^ ";\n" + | pp_stm (Effect (e)) = + pp_exp e ^ ";\n" | pp_stm (Return e) = - "return " ^ pp_exp e ^ ";" - - fun pp_stms nil = "" + "return " ^ pp_exp e ^ ";\n" + | pp_stm Nop = ";\n" + | pp_stm Break = "break;\n" + | pp_stm Continue = "continue;\n" + | pp_stm (If (e, s, NONE)) = "if ("^pp_exp e^")\n"^pp_block s + | pp_stm (If (e, s, SOME s2)) = "if ("^pp_exp e^")\n"^pp_block s^"else\n"^pp_block s2 + | pp_stm (While (e, s)) = "while ("^pp_exp e^")\n"^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 "") ^ ")\n" ^ 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 + "{\n" ^ String.concat contents ^ "}\n" + end + + and pp_stms nil = "" | pp_stms (s::ss) = pp_stm s ^ "\n" ^ pp_stms ss - fun pp_program ss = "{\n" ^ pp_stms ss ^ "}" + and pp_params nil = "" + | pp_params ((i, t)::a::l) = (pp_ident i) ^ " : " ^ (Type.Print.pp_type t) ^ ", " ^ (pp_params (a::l)) + | pp_params ((i, t)::l) = (pp_ident i) ^ " : " ^ (Type.Print.pp_type t) ^ (pp_params l) + + and pp_vars nil = "" + | pp_vars ((i, t)::l) = "var " ^ (pp_ident i) ^ " : " ^ (Type.Print.pp_type t) ^ ";\n" ^ (pp_vars l) + + and pp_function (n, Extern(t, pl)) = "extern " ^ (Type.Print.pp_type t) ^ " " ^ (pp_ident n) ^ "(" ^ (pp_params pl) ^ ");\n" + | pp_function (n, Function(t, pl, vl, stms)) = (Type.Print.pp_type t) ^ " " ^ (pp_ident n) ^ "(" ^ (pp_params pl) ^ ")\n{\n" ^ (pp_vars vl) ^ (String.concat (map pp_stm stms)) ^ "\n}\n" + | pp_function (n, MarkedFunction d) = pp_function (n, Mark.data d) + + and pp_program (types, funs) = String.concat ((map Type.Print.pp_typedef (Symbol.elemsi types)) @ (map pp_function (Symbol.elemsi funs))) end end