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 output <- interpret opt $ map (fromIntegral . ord) input putStr $ map (chr . fromIntegral) output 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"]