summaryrefslogtreecommitdiffstats
path: root/elab.sml
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2023-02-10 15:06:47 -0800
committerRose Hogenson <rhogenson@posteo.net>2023-02-10 15:06:47 -0800
commitb3f2fd686bc781996687deaadbe721b3300e4aba (patch)
tree7420e4c04fac7ad522a8ee6edc9c2d224958cd87 /elab.sml
parentd61fa242bdd71a9f535e65b96ed5407769cc792f (diff)
downloadsml-b3f2fd686bc781996687deaadbe721b3300e4aba.tar.zst
Write a first draft of the compiler.
Sorry I haven't been better about these commit messages. You're not my mom.
Diffstat (limited to 'elab.sml')
-rw-r--r--elab.sml22
1 files changed, 22 insertions, 0 deletions
diff --git a/elab.sml b/elab.sml
new file mode 100644
index 0000000..0838f38
--- /dev/null
+++ b/elab.sml
@@ -0,0 +1,22 @@
+structure Elab =
+struct
+ fun primop (s : string) : Syntax.primop =
+ case s of
+ "exit" => Syntax.PExit
+ | _ => raise Fail ("invalid op: " ^ s)
+
+ fun elaborate (p : Syntax.expr) : Syntax.lexp =
+ case p of
+ Syntax.EBuiltin builtin => Syntax.LPrim (primop builtin)
+ | Syntax.EIdent [i] => raise Fail "only primitive operations for now, no variables"
+ | Syntax.EInt i => Syntax.LInt i
+ | Syntax.EStr s => Syntax.LString s
+ | Syntax.ETuple exprs => Syntax.LRecord (map elaborate exprs)
+ | Syntax.EApp (f, x) => Syntax.LApp (elaborate f, elaborate x)
+ | Syntax.ETyped (e, _) => elaborate e
+ | Syntax.ELet (decls, body) =>
+ Syntax.LRecord
+ (map elaborate
+ (map (fn (Syntax.DVal e) => e) decls @ [body]))
+ | _ => raise Fail "elaborate: operation not supported"
+end