kaleidoscope-0.1.0.0: src/chapter6/Main.hs
module Main where
import Parser
import Codegen
import Emit
import Control.Monad.Trans
import System.IO
import System.Environment
import System.Console.Haskeline
import qualified LLVM.General.AST as AST
initModule :: AST.Module
initModule = emptyModule "my cool jit"
process :: AST.Module -> String -> IO (Maybe AST.Module)
process modo source = do
let res = parseToplevel source
case res of
Left err -> print err >> return Nothing
Right ex -> do
ast <- codegen modo ex
return $ Just ast
processFile :: String -> IO (Maybe AST.Module)
processFile fname = readFile fname >>= process initModule
repl :: IO ()
repl = runInputT defaultSettings (loop initModule)
where
loop mod = do
minput <- getInputLine "ready> "
case minput of
Nothing -> outputStrLn "Goodbye."
Just input -> do
modn <- liftIO $ process mod input
case modn of
Just modn -> loop modn
Nothing -> loop mod
main :: IO ()
main = do
args <- getArgs
case args of
[] -> repl
[fname] -> processFile fname >> return ()