functor ExnHandler(structure T: TOKENIZER; structure P: PPC): EXN_HANDLER = struct fun eprint s = printf `"error: " `s % fun otherExn e = let val hist = MLton.Exn.history e in eprint $ "exception " ^ exnMessage e ^ " was raised"; if hist = [] then (output "No stack trace is avaliable\n"; output "Recompile with -const \"Exn.keepHistory true\"\n") else List.app (fn x => printf `"\t" `x `"\n" %) hist end fun exit code = Posix.Process.exit $ Word8.fromInt code fun ioExn (IO.Io { name, function = _, cause }) = let val prefix = name ^ ": " val reason = case cause of OS.SysErr (str, _) => str | _ => exnMessage cause in printf `prefix `reason `"\n" % end | ioExn _ = (output "ioExn: unreachable\n"; exit 254) fun handler e = (case e of T.FsmTableIsTooSmall => eprint "fsm table is too small. Increate 'maxState' value" | IO.Io _ => ioExn e | T.TkErrorAug (pos, msg) => eprint $ T.S.pos2str pos ^ ": " ^ msg | P.TkError v => P.tkErrorPrint v | _ => otherExn e; exit 255) end