1 {-# OPTIONS_GHC -fno-warn-unused-do-bind -fno-warn-orphans #-}
4 -- Module : Lambda.Parser.Simple
5 -- Copyright : Tomáš Musil 2014
8 -- Maintainer : tomik.musil@gmail.com
9 -- Stability : experimental
11 -- Simple parser for λ-terms. Corresponds to the recursive λ-term definition. Application is always in brackets, nothing else is.
14 module Lambda.Parser.Simple
20 import Data.Attoparsec.Text
21 import Control.Applicative
26 -- >>> import Test.QuickCheck
27 -- >>> import Test.Term hiding (tRead, parseTerm)
30 -- >>> tShow $ Lambda "x" (Var "x")
32 -- >>> tShow $ App (Var "x") (Var "y")
35 tShow :: Term -> String
37 tShow (Lambda x t) = "\\" ++ x ++ "." ++ tShow t
38 tShow (App t r) = "(" ++ tShow t ++ " " ++ tShow r ++ ")"
41 -- prop> t == tRead (tShow t)
43 tRead :: String -> Term
44 tRead s = case parseOnly (parseTerm <* endOfInput) (T.pack s) of
48 parseVar :: Parser Term
53 parseLambda :: Parser Term
61 parseApp :: Parser Term
70 parseTerm :: Parser Term
71 parseTerm = parseVar <|> parseLambda <|> parseApp