33 lines
1.1 KiB
Haskell
33 lines
1.1 KiB
Haskell
{-# LANGUAGE LambdaCase #-}
|
|
module Main (main) where
|
|
import Control.Monad ((<$!>))
|
|
|
|
import qualified System.Environment as Env
|
|
|
|
import qualified Language.Brainfuck as Brainfuck
|
|
import qualified Data.Text as Text
|
|
import qualified Data.Text.IO as TextIO
|
|
import qualified Data.Vector as Vector
|
|
import qualified Language.Brainfuck.Instruction.Compressed as CompressedInstruction
|
|
import qualified Language.Brainfuck.Instruction.Extended as ExtendedInstruction
|
|
|
|
dumpVector :: Show a => FilePath -> Vector.Vector a -> IO ()
|
|
dumpVector path = TextIO.writeFile path . Text.unlines . map (Text.pack . show) . Vector.toList
|
|
|
|
main :: IO ()
|
|
main = do
|
|
programFile <- Env.getArgs >>= \case
|
|
[x] -> pure x
|
|
_ -> error "usage: [program] source.bf"
|
|
|
|
instructions <- (Brainfuck.parse <$!> TextIO.readFile programFile) >>= \case
|
|
Left failure -> error $ show failure
|
|
Right x -> pure x
|
|
|
|
dumpVector "native.bf" instructions
|
|
|
|
let compressed = CompressedInstruction.compress instructions
|
|
dumpVector "compressed.bf" compressed
|
|
|
|
let extended = ExtendedInstruction.parse compressed
|
|
dumpVector "extended.bf" extended
|