Add beginnings of parser.
Chris Pressey
1 year, 22 days ago
52 | 52 |
Nothing ->
|
53 | 53 |
return state
|
54 | 54 |
|
55 | |
loadAndRun s =
|
56 | |
let
|
57 | |
prog = [Mov (Direct 0) (Immediate 0)] -- TODO parse s
|
58 | |
state = initState prog
|
59 | |
in
|
60 | |
run state
|
|
55 |
loadAndRun prog = run (initState prog)
|
|
0 |
module Language.ZOWIE.Parser where
|
|
1 |
|
|
2 |
import Language.ZOWIE.State
|
|
3 |
|
|
4 |
|
|
5 |
splitLines :: String -> String -> [String]
|
|
6 |
splitLines [] line = [reverse line]
|
|
7 |
splitLines ('\n':rest) line = [reverse line] ++ (splitLines rest [])
|
|
8 |
splitLines (char:rest) line = splitLines rest (char:line)
|
|
9 |
|
|
10 |
parseLines [] = []
|
|
11 |
parseLines (line:lines) =
|
|
12 |
case parseLine line of
|
|
13 |
Just instr ->
|
|
14 |
(instr:parseLines lines)
|
|
15 |
Nothing ->
|
|
16 |
parseLines lines
|
|
17 |
|
|
18 |
parseLine [] = Nothing
|
|
19 |
parseLine (' ':rest) = parseLine rest
|
|
20 |
parseLine ('M':'O':'V':rest) = Just $ Mov (Direct 0) (Immediate 0)
|
|
21 |
|
|
22 |
|
|
23 |
parseZOWIE text =
|
|
24 |
let
|
|
25 |
lines = splitLines text []
|
|
26 |
prog = parseLines lines
|
|
27 |
in
|
|
28 |
prog
|
3 | 3 |
import System.Exit
|
4 | 4 |
import System.IO
|
5 | 5 |
|
|
6 |
import qualified Language.ZOWIE.Parser as Parser
|
6 | 7 |
import qualified Language.ZOWIE.Machine as Machine
|
7 | 8 |
|
8 | 9 |
|
|
11 | 12 |
case args of
|
12 | 13 |
["run", fileName] -> do
|
13 | 14 |
text <- readFile fileName
|
14 | |
result <- Machine.loadAndRun text
|
|
15 |
let prog = Parser.parseZOWIE text
|
|
16 |
result <- Machine.loadAndRun prog
|
15 | 17 |
putStrLn $ show $ result
|
16 | 18 |
return ()
|
17 | 19 |
_ -> do
|