forked from JulianCO/Unlambda
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMain.hs
55 lines (48 loc) · 1.32 KB
/
Main.hs
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
module Main where
import Base
import Text.Parsec
import Data.Text
import Text.Parsec.Text
import System.Environment
import Control.Monad.State
import qualified Data.Text.IO as T
parsePrimitive :: UnlambdaEnv m => Parser (Expression m)
parsePrimitive = do
c <- oneOf "skivdce@|.?r"
case c of
's' -> return (Primitive S)
'k' -> return (Primitive K)
'i' -> return (Primitive I)
'v' -> return (Primitive V)
'd' -> return (Primitive D)
'c' -> return (Primitive C)
'e' -> return (Primitive Exit)
'@' -> return (Primitive At)
'|' -> return (Primitive Pipe)
'.' -> anyChar >>= return . Primitive . Dot
'?' -> anyChar >>= return . Primitive . Ask
'r' -> return (Primitive (Dot '\n'))
parseApp :: UnlambdaEnv m => Parser (Expression m)
parseApp = do
char '`'
f <- parseExpression
g <- parseExpression
return $ App f g
parseComment :: Parser Char
parseComment = do
char '#'
many (noneOf "\n")
char '\n'
parseExpression :: UnlambdaEnv m => Parser (Expression m)
parseExpression = do
skipMany (parseComment <|> space)
parsePrimitive <|> parseApp
main = do
args <- getArgs
case args of
[] -> putStrLn "Usage: unlambda <file>"
(file:_) -> do
contents <- T.readFile file
case parse parseExpression file contents of
Left e -> print e
Right exp -> runStateT (eval exp) (Nothing :: Maybe Char) >> return ()