X-Git-Url: https://git.lukelau.me/?p=kaleidoscope-hs.git;a=blobdiff_plain;f=Main.hs;fp=Main.hs;h=816692b758ceb7dce309611947d84935df97e6e8;hp=ec0de8c8bcfd731b298ed5a09c5df8784e9f0fd3;hb=38600a47841e2c5837b5693b32c35d2093864458;hpb=3ccccc6ab809fb87dd929855936895fb11479e27 diff --git a/Main.hs b/Main.hs index ec0de8c..816692b 100644 --- a/Main.hs +++ b/Main.hs @@ -1,10 +1,35 @@ +{-# LANGUAGE OverloadedStrings #-} + import AST +import Utils +import Control.Monad.IO.Class +import qualified Data.Text.Lazy.IO as Text +import LLVM.AST.Constant +import LLVM.AST.Float +import LLVM.AST.Operand +import LLVM.AST.Type as Type +import LLVM.IRBuilder +import LLVM.Pretty import System.IO -import Text.Read -main = do - hPutStr stderr "ready> " - ast <- (readMaybe <$> getLine) :: IO (Maybe AST) +import Text.Read (readMaybe) + +main = buildModuleT "main" repl + +repl :: ModuleBuilderT IO () +repl = do + liftIO $ hPutStr stderr "ready> " + ast <- liftIO $ readMaybe <$> getLine case ast of - Just x -> hPrint stderr x - Nothing -> hPutStrLn stderr "Couldn't parse" - main + Nothing -> liftIO $ hPutStrLn stderr "Couldn't parse" + Just x -> do + hoist $ buildAST x + mostRecentDef >>= liftIO . Text.hPutStrLn stderr . ppll + repl + where + +buildAST :: AST -> ModuleBuilder Operand +buildAST (TopLevelExpr x) = function "__anon_expr" [] Type.double $ + const $ buildExpr x >>= ret + +buildExpr :: Expr -> IRBuilderT ModuleBuilder Operand +buildExpr (Num x) = pure $ ConstantOperand (Float (Double x))