Begin codegen
[kaleidoscope-hs.git] / Main.hs
1 {-# LANGUAGE OverloadedStrings #-}
2
3 import AST
4 import Utils
5 import Control.Monad.IO.Class
6 import qualified Data.Text.Lazy.IO as Text
7 import LLVM.AST.Constant
8 import LLVM.AST.Float
9 import LLVM.AST.Operand
10 import LLVM.AST.Type as Type
11 import LLVM.IRBuilder
12 import LLVM.Pretty
13 import System.IO
14 import Text.Read (readMaybe)
15
16 main = buildModuleT "main" repl
17
18 repl :: ModuleBuilderT IO ()
19 repl = do
20   liftIO $ hPutStr stderr "ready> "
21   ast <- liftIO $ readMaybe <$> getLine
22   case ast of
23     Nothing ->  liftIO $ hPutStrLn stderr "Couldn't parse"
24     Just x -> do
25       hoist $ buildAST x
26       mostRecentDef >>= liftIO . Text.hPutStrLn stderr . ppll
27   repl
28   where 
29
30 buildAST :: AST -> ModuleBuilder Operand
31 buildAST (TopLevelExpr x) = function "__anon_expr" [] Type.double $
32   const $ buildExpr x >>= ret
33
34 buildExpr :: Expr -> IRBuilderT ModuleBuilder Operand
35 buildExpr (Num x) = pure $ ConstantOperand (Float (Double x))