Parsec使い始め

以前から使おうと思って手を出してなかったParsecを使い始めました。
Parsecは、最近いろんな言語で移植が行われている構文解析のライブラリです。


パーサーの検証でいつも最初にやっている、"(123)"という文字列から123という整数を取り出す処理をParsecで書いて見ました。こうなりました。

import Text.Parsec
import Text.Parsec.String

parseText :: Parser Int
parseText = do
                char '('
                value <- many1 digit
                char ')'
                return (read value)

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 "(123)"
123

parseTextという関数が、整数を返すパーサーです。
この関数のなかで、開きカッコを無視し、整数を取り出し、閉じ括弧を無視し、取り出した整数を返す、ということをしています。C++のBoost.Spirit.Qiと似たような感じですね。


このパーサーをParsecのparse関数に渡すと、Either型の結果が返ってきます。Leftだったらエラー情報が返され、Rightだったらパース結果の型の値が返されます。


すごく素直に使えていいですねParsec。