summaryrefslogtreecommitdiff
path: root/Main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Main.hs')
-rw-r--r--Main.hs44
1 files changed, 44 insertions, 0 deletions
diff --git a/Main.hs b/Main.hs
new file mode 100644
index 0000000..9c33f83
--- /dev/null
+++ b/Main.hs
@@ -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"]