Parsec カッコで囲まれた文字列を取り出す

"(abc)"の"abc"を取り出します。

import Text.Parsec
import Text.Parsec.String

parens :: Parser a -> Parser a
parens = between (char '(') (char ')')

parseText :: Parser String
parseText = parens $ many $ noneOf ")"

run :: Show a => Parser a -> String -> IO ()
run p input
        = case (parse p "" input) of
            Left err -> do{ putStr "parse error at "
                          ; print err
                          }
            Right x  -> print x

main = do
        run parseText "(abc)"
abc

カッコ内の文字列部分をパースを終了するために「')'までをカッコ内の文字列とする」という処理をどう書くか調べていたら、noneOf関数を使用すればいいようです。C++のBoost.Spirit.Qiでいうところのoperator-()です。


Parsecには開き処理と閉じ処理のための関数betweenが用意されてるので、それを使って丸カッコをパースする関数parensを用意しています。


それとパーサーの型は「data ParsecT s u m a」となっていてよくわからなかったので、
Text.Parsec.String内で付けられている別名「Parser a」を使用しています。