import LLVM.IRBuilder
import LLVM.Pretty
import System.IO
+import System.IO.Error
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> "
- 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"
- Just x -> do
- hoist $ buildAST x
+ Just ast -> do
+ hoist $ buildAST ast
mostRecentDef >>= liftIO . Text.hPutStrLn stderr . ppll
repl
where
+ eofHandler e
+ | isEOFError e = return Nothing
+ | otherwise = ioError e
type Binds = Map.Map String Operand