109 | 109 |
-- ======================== Program States ========================= --
|
110 | 110 |
-----------------------------------------------------------------------
|
111 | 111 |
|
112 | |
data State = State Stack Interpreter Debugger
|
113 | |
|
114 | |
getInterpreter (State _ i _) = i
|
115 | |
setInterpreter (State s _ d) i = State s i d
|
116 | |
|
117 | |
statePush (State s i d) head = State (push s head) i d
|
118 | |
statePushString (State s i d) str = State (pushString s str) i d
|
119 | |
|
120 | |
statePop (State s i d) =
|
|
112 |
data State = State {
|
|
113 |
stack :: Stack,
|
|
114 |
interpreter :: Interpreter,
|
|
115 |
debugger :: Debugger,
|
|
116 |
getCh :: IO Char,
|
|
117 |
putCh :: Char -> IO ()
|
|
118 |
}
|
|
119 |
|
|
120 |
|
|
121 |
|
|
122 |
getInterpreter State{ interpreter=i } = i
|
|
123 |
setInterpreter state i = state{ interpreter=i }
|
|
124 |
|
|
125 |
getStack State{ stack=s } = s
|
|
126 |
|
|
127 |
statePush st@State{ stack=s } head = st{ stack=(push s head) }
|
|
128 |
statePushString st@State{ stack=s } str = st{ stack=(pushString s str) }
|
|
129 |
|
|
130 |
statePop st@State{ stack=s } =
|
121 | 131 |
let
|
122 | 132 |
(elem, s') = pop s
|
123 | 133 |
in
|
124 | |
(elem, (State s' i d))
|
125 | |
statePopString (State s i d) =
|
|
134 |
(elem, st{ stack=s' })
|
|
135 |
statePopString st@State{ stack=s } =
|
126 | 136 |
let
|
127 | 137 |
(string, s') = popString s
|
128 | 138 |
in
|
129 | |
(string, (State s' i d))
|
130 | |
|
131 | |
stateDebug program state@(State _ _ debugger) =
|
132 | |
debugger program state
|
|
139 |
(string, st{ stack=s' })
|
|
140 |
|
|
141 |
stateDebug program st@State{ debugger=debugger } =
|
|
142 |
debugger program st
|
133 | 143 |
|
134 | 144 |
|
135 | 145 |
-----------------------------------------------------------------------
|
|
586 | 596 |
nullDebugger p s = do
|
587 | 597 |
return ()
|
588 | 598 |
|
589 | |
stdDebugger program@(instr:rest) (State s i d) = do
|
|
599 |
stdDebugger program@(instr:rest) state = do
|
590 | 600 |
putStr "\n"
|
591 | 601 |
putStr ("Instr: " ++ [instr] ++ "\n")
|
592 | 602 |
putStr ("Rest: " ++ rest ++ "\n")
|
593 | |
putStr ("Stack: " ++ (show s) ++ "\n")
|
594 | |
putStr ("Interp: " ++ (show i) ++ "\n")
|
|
603 |
putStr ("Stack: " ++ (show (stack state)) ++ "\n")
|
|
604 |
putStr ("Interp: " ++ (show (interpreter state)) ++ "\n")
|
595 | 605 |
putStr "(press ENTER) "
|
596 | 606 |
control <- getChar
|
597 | 607 |
return ()
|
|
632 | 642 |
(Intrinsic ' ' opNop)
|
633 | 643 |
NoInterp
|
634 | 644 |
|
635 | |
runWith string debugger =
|
636 | |
let
|
637 | |
initialState = (State (Stack []) NoInterp debugger)
|
|
645 |
runWith string dbgr =
|
|
646 |
let
|
|
647 |
initialState = State{ stack=(Stack []), interpreter=NoInterp, debugger=dbgr, getCh=getChar, putCh=putChar }
|
638 | 648 |
in
|
639 | 649 |
execute (Program string initialInterpreter) initialState
|
640 | 650 |
|