diff options
| author | Rose Hogenson <rhogenson@posteo.net> | 2023-02-10 15:06:47 -0800 |
|---|---|---|
| committer | Rose Hogenson <rhogenson@posteo.net> | 2023-02-10 15:06:47 -0800 |
| commit | b3f2fd686bc781996687deaadbe721b3300e4aba (patch) | |
| tree | 7420e4c04fac7ad522a8ee6edc9c2d224958cd87 /elab.sml | |
| parent | d61fa242bdd71a9f535e65b96ed5407769cc792f (diff) | |
| download | sml-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.sml | 22 |
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 |
