From c6115098ccc1fac17e9df019d718547d4912c317 Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 26 Mar 2021 09:08:59 +0100 Subject: [PATCH] handle empty input --- impls/sml/reader.sml | 15 +++++++++------ impls/sml/step1_read_print.sml | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/impls/sml/reader.sml b/impls/sml/reader.sml index 18f7e51d..08f91fa4 100644 --- a/impls/sml/reader.sml +++ b/impls/sml/reader.sml @@ -27,6 +27,7 @@ fun tokenString SPACE = "SPACE" | tokenString AT = "AT" | tokenString (ATOM s) = "ATOM (" ^ s ^ ")" +exception Nothing exception SyntaxError of string exception ReaderError of string @@ -87,11 +88,7 @@ fun scanToken ss = Option.composePartial (applyScanner, findScanner) scanners end -fun tokenize s = - s |> Ss.full - |> tokenize' [] - |> List.filter (fn x => x <> SPACE) - |> takeWhile (fn COMMENT _ => false | _ => true) +fun tokenize s = tokenize' [] (Ss.full s) and tokenize' acc ss = case scanToken ss of SOME (token, rest) => tokenize' (token::acc) rest @@ -118,5 +115,11 @@ and readForm r = then readList [] (rest r) else readAtom r +fun clean ts = + ts |> List.filter (fn x => x <> SPACE) + |> takeWhile (fn COMMENT _ => false | _ => true) + fun readStr s = - s |> tokenize |> READER |> readForm |> #1 + case tokenize s |> clean of + [] => raise Nothing + | ts => ts |> READER |> readForm |> #1 diff --git a/impls/sml/step1_read_print.sml b/impls/sml/step1_read_print.sml index 0f31b74e..f9bb1510 100644 --- a/impls/sml/step1_read_print.sml +++ b/impls/sml/step1_read_print.sml @@ -10,6 +10,7 @@ fun PRINT f = fun rep s = s |> READ |> EVAL |> PRINT handle SyntaxError msg => "SYNTAX ERROR: " ^ msg + | Nothing => "" fun repl () = let open TextIO