{-# LANGUAGE Haskell2010 #-} module Main where import Control.Applicative import Text.Parser.Char import Text.Parser.Combinators import Text.Parser.Token import qualified Data.Attoparsec.Text as AT import qualified Data.Text as T import System.IO import Language.GuardedCommands main :: IO () main = do c <- T.pack <$> getContents case AT.parseOnly (optional someSpace *> pGCL pVoid (pBoolExpr pVar) <* AT.endOfInput) c of Left e -> hPutStrLn stderr e Right v -> print v data BoolExpr a = And (BoolExpr a) (BoolExpr a) | Or (BoolExpr a) (BoolExpr a) | Literal Bool | Atom a deriving Show pBoolExpr :: TokenParsing m => m atom -> m (BoolExpr atom) pBoolExpr pAtom = p0 where p0 = flOr <$> p1 <*> many (symbol "\\/" *> p1) p1 = flAnd <$> p2 <*> many (symbol "/\\" *> p2) p2 = between (symbol "(") (symbol ")") p0 <|> Literal True <$ symbol "true" <|> Literal False <$ symbol "false" <|> Atom <$> pAtom flOr x xs = foldr1 Or (x:xs) flAnd x xs = foldr1 And (x:xs) pVar :: TokenParsing m => m String pVar = token (some upper) data Void instance Show Void where show _ = "" pVoid :: Alternative m => m Void pVoid = empty