module Main where import Monad import System.Environment import Control.Monad.Error import Text.ParserCombinators.Parsec -- ghc --make p.hs && ./p '((#)(())(((:)))(.))' one two three main :: IO () main = do args <- getArgs putStrLn $ args !! 0 putStrLn $ foldl (++) "" args putStrLn $ foldl (\a b -> a ++ "," ++ b) "" args putStrLn $ translateList (args !! 0) return () translateList :: String -> String translateList input = case parse parseList "LIST" input of Left err -> "ERROR{" ++ show err ++ "}" Right s -> "GOOD{" ++ show s ++ "}" symbolStr :: Parser String symbolStr = liftM (\c -> [c,c,c]) symbol symbol :: Parser Char symbol = oneOf "!$%|*+-/:<=?>@#,^" parseDot :: Parser String parseDot = (char '.') >> (return ")") parseLists :: Parser String parseLists = do -- z <- (try parseList) <|> parseDot z <- (try parseList) <|> symbolStr <|> parseDot return z parseList :: Parser String parseList = do char '(' inner <- many parseLists char ')' return $ "<" ++ (foldl (++) "" inner) ++ ">"