projects
/
kaleidoscope-hs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Handle EOFs in the repl
[kaleidoscope-hs.git]
/
Main.hs
diff --git
a/Main.hs
b/Main.hs
index cf20ab898fa2bd9744d698f29ee8dffea73b1bfe..f32003bdd2dbb48eba325526bf1849444fd1d09d 100644
(file)
--- a/
Main.hs
+++ b/
Main.hs
@@
-15,21
+15,29
@@
import LLVM.AST.Type as Type
import LLVM.IRBuilder
import LLVM.Pretty
import System.IO
import LLVM.IRBuilder
import LLVM.Pretty
import System.IO
+import System.IO.Error
import Text.Read (readMaybe)
import Text.Read (readMaybe)
-main = buildModuleT "main" repl
+main :: IO ()
+main = buildModuleT "main" repl >>= Text.hPutStrLn stderr . ("\n" <>) . ppll
repl :: ModuleBuilderT IO ()
repl = do
liftIO $ hPutStr stderr "ready> "
repl :: ModuleBuilderT IO ()
repl = do
liftIO $ hPutStr stderr "ready> "
- ast <- liftIO $ readMaybe <$> getLine
- case ast of
+ mline <- liftIO $ catchIOError (Just <$> getLine) eofHandler
+ case mline of
+ Nothing -> return ()
+ Just l -> do
+ case readMaybe l of
Nothing -> liftIO $ hPutStrLn stderr "Couldn't parse"
Nothing -> liftIO $ hPutStrLn stderr "Couldn't parse"
-
Just x
-> do
- hoist $ buildAST x
+
Just ast
-> do
+ hoist $ buildAST ast
mostRecentDef >>= liftIO . Text.hPutStrLn stderr . ppll
repl
where
mostRecentDef >>= liftIO . Text.hPutStrLn stderr . ppll
repl
where
+ eofHandler e
+ | isEOFError e = return Nothing
+ | otherwise = ioError e
type Binds = Map.Map String Operand
type Binds = Map.Map String Operand