From 5582235bd300f8de997192f9109d596d12df4bbe Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Fri, 16 May 2025 16:54:17 -0700 Subject: Fix spelling of file names --- Compiler.sml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Compiler.sml (limited to 'Compiler.sml') 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 ] " + 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 -- cgit v1.3.1