summaryrefslogtreecommitdiff
path: root/Main.hs
blob: c7ca464af7a45af6ad197bde22677b169dfeb663 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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 <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

            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"]