Advertisement
Yurry

Criterion format converter

Sep 18th, 2013
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Control.Applicative
  2. import qualified Data.ByteString.Char8 as BS
  3. import Data.Attoparsec.Char8
  4. import qualified Data.Attoparsec.Char8 as Parsec (takeWhile)
  5. import Data.List
  6. import Data.Maybe
  7. import Text.Printf
  8.  
  9. type Word = BS.ByteString
  10. data Criterion = Criterion Word [(Maybe Criterion, Word)]
  11.     deriving Show
  12.  
  13. convert :: Criterion -> String
  14. convert (Criterion word pairs) = case catMaybes criterions of
  15.     [] -> outWords
  16.     cr -> printf "(&%s(|%s))" outWords (concatMap (printf "(%s)" . convert :: Criterion -> String) cr)
  17.     where (criterions, words) = unzip pairs
  18.           outWords = printf "(%s %s)" (BS.unpack word) (BS.unpack $ BS.unwords words)
  19.  
  20. criterion = Criterion <$> Parsec.takeWhile (notInClass " ]") <*> many pair
  21.  
  22. pair = do
  23.     space
  24.     crit <- optional (char '[' *> criterion <* char ']' <* space)
  25.     word <- char '"' *> Parsec.takeWhile (/= '"') <* char '"'
  26.     return (crit, word)
  27.  
  28. main = BS.getLine >>= putStrLn . either id convert . parseOnly criterion
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement