data Node = Move Int
| Add Int Int
| Loop Int [Node]
| Put Int
| Get Int
deriving (Show,Eq)
type Prog = [Node]
gen :: [Node] -> [Char]
gen x = node x 0 0 where
move :: Int -> [Char]
move n =
replicate (abs n) (if n>0 then '>' else '<')
node :: [Node] -> Int -> Int -> [Char]
node [] pos end =
move(end-pos)
node (Move n:xs) pos end =
node xs (pos-n) end
node (Add p n:xs) pos end =
let c = if n>0 then '+' else '-' in
move(p-pos)++replicate (abs n) c++node xs p end
node (Loop p x:xs) pos end =
move(p-pos)++"["++node x p p++"]"++node xs p end
node (Put p:xs) pos end =
move(p-pos)++"."++node xs p end
node (Get p:xs) pos end =
move(p-pos)++","++node xs p end
dup :: Int -> Int -> Int -> [Node]
dup from to temp =
[Loop from [Add from (-1),Add to 1,Add temp 1],Loop temp [Add temp (-1),Add from 1]]
clr pos = [Loop pos [Add pos (-1)]]
mov from to =
[Loop from [Add from (-1),Add to 1]]
swap x y temp =
mov x temp++mov y x++mov temp y
stack_push x =
[Add 0 x,Move 1]
test :: [([Node],[Char])]
test = [
(swap 1 0 2, ">[->+<]<[->+<]>>[-<<+>>]<<"),
(clr 2, ">>[-]<<"),
([Add 4 2,Add 2 4,Loop 3 [Add 2 (-1),Add 3 1]],">>>>++<<++++>[<->+]<<<"),
([Add 4 2,Add 2 4,Move 1,Add 0 2]++clr 4,">>>>++<<++++<++>>>>[-]<<<<")
]
main = do
print $ map (\(x,y)->gen x==y) test