blob: b6afbea40893f1a8b1999eb158aa2446b890192f (
plain)
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
module Unlambda.Parser (
UnlambdaTerm(..),
parseUnlambda
) where
import Control.Applicative( some )
import Text.ParserCombinators.Parsec
data UnlambdaTerm = S | K | I | V | R | D | C
| Dot { cha :: Char }
| App { func :: UnlambdaTerm
, arg :: UnlambdaTerm }
deriving (Eq, Show)
parseUnlambda :: String -> Either ParseError UnlambdaTerm
parseUnlambda = parse unlambda "error"
unlambda = do
whiteSpace
t <- term
eof
return t
term = (try app)
<|> (try s)
<|> (try k)
<|> (try i)
<|> (try v)
<|> (try r)
<|> (try d)
<|> (try c)
<|> (try dot)
<?> "unlambda term"
app = do
char '`'
whiteSpace
f <- term
x <- term
return (App f x)
s = char 's' >> whiteSpace >> return S
k = char 'k' >> whiteSpace >> return K
i = char 'i' >> whiteSpace >> return I
v = char 'v' >> whiteSpace >> return V
r = char 'r' >> whiteSpace >> return R
d = char 'd' >> whiteSpace >> return D
c = char 'c' >> whiteSpace >> return C
dot = do
char '.'
c <- noneOf("")
whiteSpace
return (Dot c)
whiteSpace = many (oneOf "\t\n\r ")
|