diff options
Diffstat (limited to 'Main.hs')
-rw-r--r-- | Main.hs | 44 |
1 files changed, 44 insertions, 0 deletions
@@ -0,0 +1,44 @@ +module Main where + +import Control.Monad +import Data.Char +import System.Environment +import System.Exit +import System.Process + +import AST +import Compiler +import Interpreter +import Parser +import Optimiser + + +data ExecutionMode = EMInterpret | EMCompile + +executionMode :: ExecutionMode +executionMode = EMCompile + + +main :: IO () +main = do + args <- getArgs + when (length args == 0 || length args > 2) + $ die "Usage: bfcomphs <source.bf>" + let fname = head args + + prog <- readFile fname >>= either die return . parseProgram + + -- putStrLn $ astSuccinct prog + -- print prog + let opt = optimise prog + writeFile (fname ++ ".succinct") $ astSuccinct opt + writeFile (fname ++ ".ast") $ show opt + + case executionMode of + EMInterpret -> do + input <- getContents + interpret opt (map (fromIntegral . ord) input) >>= (putStr . map (chr . fromIntegral)) + EMCompile -> do + writeFile (fname ++ ".asm") $ compile opt + callProcess "yasm" ["-f", "macho64", fname ++ ".asm", "-o", fname ++ ".o"] + callProcess "gcc" [fname ++ ".o", "-o", fname ++ ".exe"] |