initial; no loops
This commit is contained in:
4
Setup.hs
Normal file
4
Setup.hs
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env runhaskell
|
||||||
|
|
||||||
|
import Distribution.Simple
|
||||||
|
main = defaultMain
|
28
brainf*ck.cabal
Normal file
28
brainf*ck.cabal
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Name: brainfuck
|
||||||
|
Version: 0.1.0
|
||||||
|
Synopsis: Brainfuck interpreter and REPL.
|
||||||
|
Description:
|
||||||
|
brainfuck is a Haskell implementation of the programming
|
||||||
|
language Brainfuck(http://www.muppetlabs.com/~breadbox/bf/).
|
||||||
|
|
||||||
|
License: GPL
|
||||||
|
License-file: LICENSE
|
||||||
|
Author: Veit Heller <veitheller.de>
|
||||||
|
Maintainer: Veit Heller <github.com/hellerve>
|
||||||
|
Bug-Reports: http://github.com/hellerve/brainfuck/issues
|
||||||
|
Build-Type: Simple
|
||||||
|
Category: Compilers/Interpreters, Language
|
||||||
|
Tested-with: GHC == 7.8.4, GHC == 7.6.3
|
||||||
|
Cabal-Version: >= 1.2
|
||||||
|
Extra-Source-Files: README.md
|
||||||
|
LICENSE
|
||||||
|
|
||||||
|
Source-Repository head
|
||||||
|
Type: git
|
||||||
|
Location: git://github.com/hellerve/brainfuck.git
|
||||||
|
|
||||||
|
Executable brainfuck
|
||||||
|
Build-Depends: base, containers, haskeline
|
||||||
|
Extensions: ExistentialQuantification CPP
|
||||||
|
ghc-options: -Wall -Werror -O2
|
||||||
|
Main-is: brainf*ck.hs
|
80
brainf*ck.hs
Normal file
80
brainf*ck.hs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
module Main where
|
||||||
|
|
||||||
|
import Data.Char
|
||||||
|
import Data.Sequence hiding (null)
|
||||||
|
import System.Console.Haskeline
|
||||||
|
import System.Environment
|
||||||
|
|
||||||
|
name :: String
|
||||||
|
name = "brainfuck"
|
||||||
|
|
||||||
|
version :: String
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
prompt :: String
|
||||||
|
prompt = name ++ "> "
|
||||||
|
|
||||||
|
printUsage :: IO ()
|
||||||
|
printUsage = do printVersion
|
||||||
|
putStrLn("\nUsage: " ++
|
||||||
|
"\n\twithout arguments - runs REPL" ++
|
||||||
|
"\n\t-h/--help - display this help message" ++
|
||||||
|
"\n\nMore information can be found on " ++
|
||||||
|
"https://github.com/hellerve/unlambda")
|
||||||
|
|
||||||
|
printVersion :: IO ()
|
||||||
|
printVersion = putStrLn (name ++ " Version " ++ version)
|
||||||
|
|
||||||
|
printCommands :: IO ()
|
||||||
|
printCommands = putStrLn "Press Ctrl-C to exit interpreter"
|
||||||
|
|
||||||
|
program :: String -> Seq Int -> Int -> IO ()
|
||||||
|
program "" _ _ = return ()
|
||||||
|
program ('>' : l) tape ptr = program l tape (ptr+1)
|
||||||
|
program ('<' : l) tape ptr = program l tape (ptr-1)
|
||||||
|
program ('+' : l) tape ptr = let newtape = update ptr ((index tape ptr) + 1) tape
|
||||||
|
in program l newtape ptr
|
||||||
|
program ('-' : l) tape ptr = let newtape = update ptr ((index tape ptr) - 1) tape
|
||||||
|
in program l newtape ptr
|
||||||
|
program ('.' : l) tape ptr = do putChar $ chr $ index tape ptr
|
||||||
|
program l tape ptr
|
||||||
|
program (',' : l) tape ptr = do x <- getChar
|
||||||
|
let newtape = update ptr (ord x) tape
|
||||||
|
program l newtape ptr
|
||||||
|
program (x : _) _ _ = putStrLn ("Unknown instruction: " ++ [x])
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
args <- getArgs
|
||||||
|
if null args
|
||||||
|
then do printVersion
|
||||||
|
printCommands
|
||||||
|
putStrLn ""
|
||||||
|
repl
|
||||||
|
else
|
||||||
|
if(head args == "-h") || (head args == "--help")
|
||||||
|
then printUsage
|
||||||
|
else exec args
|
||||||
|
|
||||||
|
exec :: [String] -> IO ()
|
||||||
|
exec _ = undefined
|
||||||
|
|
||||||
|
getInput :: IO String
|
||||||
|
getInput = runInputT defaultSettings repl_
|
||||||
|
where repl_ = do
|
||||||
|
x <- getInputLine "> "
|
||||||
|
case x of
|
||||||
|
Nothing -> return ""
|
||||||
|
Just i -> return i
|
||||||
|
|
||||||
|
repl :: IO ()
|
||||||
|
repl = do input <- getInput
|
||||||
|
case input of
|
||||||
|
"" -> repl
|
||||||
|
"quit" -> putStrLn "Bye"
|
||||||
|
x -> do program x (zeroes 30000 empty) 0
|
||||||
|
putStrLn ""
|
||||||
|
repl
|
||||||
|
where zeroes :: Int -> Seq Int -> Seq Int
|
||||||
|
zeroes 0 l = l
|
||||||
|
zeroes n l = zeroes (n-1) (l |> 0)
|
Reference in New Issue
Block a user