4de3762969f4a7534c5201af4fa82b6cfd2f9464
[fp.git] / src / Main.hs
1 {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
2
3 module Main where
4
5 import Data.Text as T (Text)
6 import qualified Data.Text.IO as T
7 import Data.Attoparsec.Text
8 import qualified Data.Map as M
9 import Control.Applicative
10 import System.Environment
11
12 import Lambda
13
14 data Definition = Definition String Term
15
16 dictionary :: [Definition] -> M.Map String Term
17 dictionary = M.fromList . map (\ (Definition s t) -> (s, t))
18
19 parseDefinition :: Parser Definition
20 parseDefinition = do
21   name <- many1 letter
22   char '='
23   t <- parseTerm
24   return $! Definition name t
25
26 parseFile :: Text -> ([Definition], [Term])
27 parseFile txt = case cnt of
28     (Right t) -> t
29     (Left e) -> error e
30   where cnt = parseOnly (parserF <* endOfInput) txt
31         parserF = do
32           defs <- many (parseDefinition <* char '\n')
33           terms <- many (parseTerm <* char '\n')
34           return $! (defs, terms)
35
36 printEval :: Term -> IO ()
37 printEval t = do
38   putStrLn $ show t ++ ":"
39   putStrLn $ "  " ++ show (reduce t)
40   putStrLn ""
41
42 main :: IO ()
43 main = do
44   [filename] <- getArgs
45   (defs, terms) <- parseFile <$> T.readFile filename
46   mapM_ printEval terms