open Printf let error_to_string e = try raise e with | Parser.Expected t -> sprintf "expected %s" t | Parser.Unexpected_token t -> sprintf "unexpected token \"%s\"" t | Failure f -> f | Division_by_zero -> "cannot divide by zero" | _ -> raise e let print_error e = printf "error: %s\n" @@ error_to_string e (* simple REPL *) let rec repl () : unit = printf "> "; let line = read_line () in if line <> "quit" then begin try line |> Lex.tokenize |> Parser.parse |> Eval.eval |> Ast.typ_to_string |> printf "%s\n" with | e -> print_error e; repl () end let () = repl ()