module Main where import Control.Monad import Data.Char import System.Environment import System.Exit import qualified System.Info as System (os) 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 " 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 let format = case System.os of "darwin" -> "macho64" "linux" -> "elf64" _ -> undefined callProcess "yasm" ["-f", format, fname ++ ".asm", "-o", fname ++ ".o"] callProcess "gcc" [fname ++ ".o", "-o", fname ++ ".exe"]