module Main where import Control.DeepSeq import Control.Monad import Data.Char import System.Environment import System.Exit 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.asm]" let fname = head args destfname = if length args == 2 then args !! 1 else fname ++ ".asm" prog <- readFile fname >>= either die return . parseProgram -- putStrLn $ astSuccinct prog -- print prog let opt = optimise prog showopt = force $ show opt when False $ putStrLn $ astSuccinct opt when False $ putStrLn showopt case executionMode of EMInterpret -> do -- input <- getContents -- putStr $ map (chr . fromIntegral) $ interpret opt (map (fromIntegral . ord) input) input <- getContents interpret opt (map (fromIntegral . ord) input) >>= (putStr . map (chr . fromIntegral)) EMCompile -> do writeFile destfname $ compile opt