Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Applicative
- import qualified Data.ByteString.Char8 as BS
- import Data.Attoparsec.Char8
- import qualified Data.Attoparsec.Char8 as Parsec (takeWhile)
- import Data.List
- import Data.Maybe
- import Text.Printf
- type Word = BS.ByteString
- data Criterion = Criterion Word [(Maybe Criterion, Word)]
- deriving Show
- convert :: Criterion -> String
- convert (Criterion word pairs) = case catMaybes criterions of
- [] -> outWords
- cr -> printf "(&%s(|%s))" outWords (concatMap (printf "(%s)" . convert :: Criterion -> String) cr)
- where (criterions, words) = unzip pairs
- outWords = printf "(%s %s)" (BS.unpack word) (BS.unpack $ BS.unwords words)
- criterion = Criterion <$> Parsec.takeWhile (notInClass " ]") <*> many pair
- pair = do
- space
- crit <- optional (char '[' *> criterion <* char ']' <* space)
- word <- char '"' *> Parsec.takeWhile (/= '"') <* char '"'
- return (crit, word)
- main = BS.getLine >>= putStrLn . either id convert . parseOnly criterion
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement