-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathParser.hs
More file actions
43 lines (36 loc) · 1.08 KB
/
Copy pathParser.hs
File metadata and controls
43 lines (36 loc) · 1.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{-# LANGUAGE NoImplicitPrelude #-}
module BFParser where
import BF
import Prelude (Char, Show, Eq, String, Maybe(..), map, (.), ($), tail)
data Cmd = P | M | L | R | I | O | B | E | Void
deriving (Eq, Show)
type Input = [Cmd]
lex :: Char -> Cmd
lex '+' = P
lex '-' = M
lex '<' = L
lex '>' = R
lex '.' = O
lex ',' = I
lex '[' = B
lex ']' = E
lex _ = Void
parse :: Input -> ([Command], Input)
parse (P:xs) = let (p, r) = parse xs in (Plus:p, r)
parse (M:xs) = let (p, r) = parse xs in (Minus:p, r)
parse (L:xs) = let (p, r) = parse xs in (ShiftL:p, r)
parse (R:xs) = let (p, r) = parse xs in (ShiftR:p, r)
parse (I:xs) = let (p, r) = parse xs in (In:p, r)
parse (O:xs) = let (p, r) = parse xs in (Out:p, r)
parse (Void:xs) = parse xs
parse (E:xs) = ([], E:xs) -- semi-error
parse (B:xs) = case rest of
(E:rest') -> ((Loop subtree):p, r)
otherwise -> ([], B:xs)
where (p, r) = parse (tail rest)
(subtree, rest) = parse xs
parse [] = ([], [])
parseProgram :: String -> Maybe Program
parseProgram str = case (parse . map lex) str of
(cmds, []) -> Just $ cmds
(_, x:_) -> Nothing