+
+ val _ = Flag.guard flag_verbose say " Stringifying..."
+ val x86d = [x86.DIRECTIVE(".globl " ^ name),
+ x86.DIRECTIVE(name ^ ":")]
+ @ x86p
+ val code = Stringify.stringify realname x86d
+ in
+ code
+ end
+
+ fun main (name, args) =
+ let
+ val header = "Usage: compile [OPTION...] SOURCEFILE\nwhere OPTION is"
+ val usageinfo = G.usageInfo {header = header, options = options}
+ fun errfn msg = (say (msg ^ "\n" ^ usageinfo) ; raise EXIT)
+
+ val _ = Temp.reset (); (* reset temp variable counter *)
+ val _ = reset_flags (); (* return all flags to default value *)
+
+ val _ = if List.length args = 0 then
+ (say usageinfo; raise EXIT)
+ else ()
+
+ val (opts, files) =
+ G.getOpt {argOrder = G.Permute,
+ options = options,
+ errFn = errfn}
+ args
+
+ val source =
+ case files
+ of [] => errfn "Error: no input file"
+ | [filename] => filename
+ | _ => errfn "Error: more than one input file"
+
+ val _ = Flag.guard flag_verbose say ("Parsing... " ^ source)
+ val ast = Parse.parse source
+ val (_, funcs) = ast
+ val _ = Flag.guard flag_ast
+ (fn () => say (Ast.Print.pp_program ast)) ()
+
+ val externs = Symbol.mapPartiali
+ (fn (a, b) => case (AstUtils.Function.data b)
+ of Ast.Extern _ => SOME(Symbol.name a)
+ | _ => NONE
+ ) funcs
+
+ val _ = Flag.guard flag_verbose say "Checking..."
+ val ast = TypeChecker.typecheck ast
+
+ val _ = Flag.guard flag_verbose say "Translating..."
+ val ir = Trans.translate ast
+ val _ = Flag.guard flag_ir (fn () => say (Tree.Print.pp_program ir)) ()