|
0 |
module Language.Burro.Debugger where
|
|
1 |
|
|
2 |
import System.Environment
|
|
3 |
|
|
4 |
import Language.Burro hiding (exec, run, interpret)
|
|
5 |
|
|
6 |
|
|
7 |
dump :: Burro -> State -> IO ()
|
|
8 |
dump p s = do
|
|
9 |
putStrLn (show s ++ " ::: " ++ show p)
|
|
10 |
|
|
11 |
exec :: Burro -> State -> IO State
|
|
12 |
exec (Seq a b) s = do
|
|
13 |
s' <- exec a s
|
|
14 |
s'' <- exec b s'
|
|
15 |
return s''
|
|
16 |
exec Null s = do
|
|
17 |
dump Null s
|
|
18 |
return s
|
|
19 |
exec ToggleHalt s@(State dat stack halt) = do
|
|
20 |
dump ToggleHalt s
|
|
21 |
return $ State dat stack (not halt)
|
|
22 |
exec Inc s@(State dat stack halt) = do
|
|
23 |
dump Inc s
|
|
24 |
return $ State (inc dat) stack halt
|
|
25 |
exec Dec s@(State dat stack halt) = do
|
|
26 |
dump Dec s
|
|
27 |
return $ State (dec dat) stack halt
|
|
28 |
exec GoLeft s@(State dat stack halt) = do
|
|
29 |
dump GoLeft s
|
|
30 |
return $ State (left dat) stack halt
|
|
31 |
exec GoRight s@(State dat stack halt) = do
|
|
32 |
dump GoRight s
|
|
33 |
return $ State (right dat) stack halt
|
|
34 |
exec p@(Test thn els) s@(State dat stack halt) = do
|
|
35 |
dump p s
|
|
36 |
let x = get dat
|
|
37 |
let (dat', stack') = swap dat stack
|
|
38 |
let stack'' = right (set stack' (0 - (get stack')))
|
|
39 |
let f = if x > 0 then thn else if x < 0 then els else Null
|
|
40 |
(State dat''' stack''' halt') <- exec f (State dat' stack'' halt)
|
|
41 |
let (dat'''', stack'''') = swap dat''' (left stack''')
|
|
42 |
return $ State dat'''' stack'''' halt'
|
|
43 |
|
|
44 |
run program state = do
|
|
45 |
state'@(State dat' stack' halt') <- exec program state
|
|
46 |
case halt' of
|
|
47 |
False -> run program (State dat' (tape [0]) True)
|
|
48 |
True -> return state'
|
|
49 |
|
|
50 |
interpret text = run (parse text) newstate
|