git @ Cat's Eye Technologies Burro / 4af8505
Add rudiementary Burro debugger and rudimentary example programs. Chris Pressey 4 years ago
5 changed file(s) with 62 addition(s) and 2 deletion(s). Raw diff Collapse all Expand all
0 + --(>/+++++>)<
0 +++ --(>/+++++>)<
0 +++++>++++>+++>++>+>
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
11
22 import System.Environment
33 import Language.Burro
4 import qualified Language.Burro.Debugger as Debugger
45
56 main = do
67 args <- getArgs
78 case args of
8 [fileName] -> do
9 ["run", fileName] -> do
910 c <- readFile fileName
1011 burroText <- readFile fileName
1112 putStrLn $ show $ interpret burroText
13 ["debug", fileName] -> do
14 c <- readFile fileName
15 burroText <- readFile fileName
16 state <- Debugger.interpret burroText
17 putStrLn $ show $ state
1218 _ -> do
13 putStrLn "Usage: burro <filename.burro>"
19 putStrLn "Usage: burro (run|debug) <filename.burro>"