以前から使おうと思って手を出してなかった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。