summaryrefslogtreecommitdiffstats
path: root/Compiler.sml
diff options
context:
space:
mode:
Diffstat (limited to 'Compiler.sml')
-rw-r--r--Compiler.sml40
1 files changed, 40 insertions, 0 deletions
diff --git a/Compiler.sml b/Compiler.sml
new file mode 100644
index 0000000..4c5e238
--- /dev/null
+++ b/Compiler.sml
@@ -0,0 +1,40 @@
+structure Compiler =
+struct
+ fun compile (prog : Syntax.expr) : Word8Vector.vector =
+ let
+ val _ = print ("ast:\n" ^ Syntax.exprToString prog ^ "\n")
+ val elab = Elab.elaborate prog
+ val _ = print ("lambda lang:\n" ^ Syntax.lexpToString elab ^ "\n")
+ val cps =
+ CPS.toCPS elab
+ (fn _ => Syntax.CPrimop (Syntax.PExit, [Syntax.VInt 0], [], []))
+ val _ = print ("cps1:\n" ^ Syntax.cexpToString cps ^ "\n")
+ val cps' = CPS.convertClosures cps
+ val _ = print ("cps:\n" ^ Syntax.cexpToString cps' ^ "\n")
+ val asm = CodeGen.toASM cps'
+ val _ = print ("bytecode:\n" ^ String.concatWith "\n" (map Syntax.opcodeToString asm) ^ "\n")
+ in
+ Linker.link asm
+ end
+
+ fun main (args : string list) : unit =
+ let
+ val opts = { o = ref "a.out" }
+ val flags =
+ [ ("o", Opts.StringOpt (fn arg => #o opts := arg)) ]
+ val filename =
+ case Opts.getOpt flags args of
+ [arg] => arg
+ | _ => raise Fail "usage: sml [-o <outfile>] <filename>"
+ val ast =
+ case Parser.parse filename of
+ Result.Left e =>
+ (print e ;
+ OS.Process.exit OS.Process.failure)
+ | Result.Right x => x
+ val bytecode = compile ast
+ val outFile = BinIO.openOut (!(#o opts))
+ in
+ BinIO.output (outFile, bytecode)
+ end
+end