From 8b3a9b8f0d80e7dd789f363deb6bb36189a31f01 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sun, 18 May 2025 08:17:20 -0700 Subject: Add a typechecker --- generate-show-syntax.sml | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) (limited to 'generate-show-syntax.sml') diff --git a/generate-show-syntax.sml b/generate-show-syntax.sml index d58d73d..c1e104f 100644 --- a/generate-show-syntax.sml +++ b/generate-show-syntax.sml @@ -4,30 +4,31 @@ use "Syntax.sml"; use "Parser.sml"; use "Opts.sml"; -val header = - "fun intToStringI (_ : string) (i : int) : string = Int.toString i\n" - ^ "\n" - ^ "fun varToStringI (_ : string) (v : Syntax.var) : string = \"Var \" ^ Int.toString v\n" - ^ "\n" - ^ "fun stringToStringI (_ : string) (s : string) : string = \"\\\"\" ^ String.toString s ^ \"\\\"\"\n" - ^ "\n" - ^ "fun optionToString (_ : string -> 'a -> string) (_ : string) NONE : string = \"NONE\"\n" - ^ " | optionToString show indent (SOME x) = \"SOME (\" ^ show indent x ^ \")\"\n" - ^ "\n" - ^ "fun listToString (_ : string -> 'a -> string) (_ : string) ([] : 'a list) : string = \"[]\"\n" - ^ " | listToString show indent [x] = \"[\" ^ show indent x ^ \"]\"\n" - ^ " | listToString show indent xs =\n" - ^ " let val indent' = indent ^ \" \" in\n" - ^ " \"[\\n\"\n" - ^ " ^ indent' ^ String.concatWith (\",\\n\" ^ indent') (map (show indent') xs) ^ \"\\n\"\n" - ^ " ^ indent ^ \"]\"\n" - ^ " end\n" +val header = "\ + \fun intToStringI (_ : string) (i : int) : string = Int.toString i\n\ + \\n\ + \fun varToStringI (_ : string) (v : Syntax.var) : string = \"Var \" ^ Int.toString v\n\ + \\n\ + \fun stringToStringI (_ : string) (s : string) : string = \"\\\"\" ^ String.toString s ^ \"\\\"\"\n\ + \\n\ + \fun optionToString (_ : string -> 'a -> string) (_ : string) NONE : string = \"NONE\"\n\ + \ | optionToString show indent (SOME x) = \"SOME (\" ^ show indent x ^ \")\"\n\ + \\n\ + \fun listToString (_ : string -> 'a -> string) (_ : string) ([] : 'a list) : string = \"[]\"\n\ + \ | listToString show indent [x] = \"[\" ^ show indent x ^ \"]\"\n\ + \ | listToString show indent xs =\n\ + \ let val indent' = indent ^ \" \" in\n\ + \ \"[\\n\"\n\ + \ ^ indent' ^ String.concatWith (\",\\n\" ^ indent') (map (show indent') xs) ^ \"\\n\"\n\ + \ ^ indent ^ \"]\"\n\ + \ end\n\ +\" fun showTy (Syntax.Tyvar var) : string = var ^ "ToStringI" | showTy (Syntax.Tycon ([ty], con)) = con ^ "ToString (" ^ showTy ty ^ ")" | showTy (Syntax.TyTuple tys) = let val vars = List.tabulate (length tys, fn i => "x" ^ Int.toString i) in - "(fn indent => fn (" ^ String.concatWith ", " vars ^ ") => let val indent' = indent ^ \" \" in \"(\\n\" ^ indent' ^ " ^ String.concatWith " ^ \",\\n\" ^ indent' ^ " (map (fn (var, ty) => showTy ty ^ " indent' " ^ var) (ListPair.zip (vars, tys))) ^ " ^ \"\\n\" ^ indent ^ \")\" end)" + "(fn indent => fn (" ^ String.concatWith ", " vars ^ ") => let val indent' = indent ^ \" \" in \"(\\n\" ^ indent' ^ " ^ String.concatWith " ^ \",\\n\" ^ indent' ^ " (map (fn (var, ty) => showTy ty ^ " indent' " ^ var) (ListPair.zipEq (vars, tys))) ^ " ^ \"\\n\" ^ indent ^ \")\" end)" end | showTy _ = "(fn _ => fn _ => \"UNHANDLED\")" @@ -51,7 +52,7 @@ val _ = TextIO.output (out, "(*\n This file was generated by generate-show-synt val _ = TextIO.output (out, "structure Show" ^ structName ^ " = struct\n") val _ = TextIO.output (out, header) val _ = map - (fn (i, Syntax.DDatatype (typeName, cases)) => + (fn (i, Syntax.DDatatype (_, typeName, cases)) => (TextIO.output (out, "\n" ^ (if i = 0 then "fun" else "and") ^ " " ^ String.concatWith "\n | " (map -- cgit v1.3.1