はじめてのParsec

昨年の暮れから、空いている時間を見つけてはHaskellのお勉強をしているのですが、ここ数日はParsecを触っていてエラーメッセージが分かり辛いとか、そういうお正月を過ごしています。

普通であれば、手始めに四則演算なぞをパースしてみるところな気がしますが、何か... 勝手が違う... というか... あれ?これはStringでこっちはIO Monadなのか... あれ?エラーメッセージわかんねぇ... みたいな状況なので、シンプルなやつから練習していく所存です。

とりあえず、数値とアルファベットをパースするものを。

import Text.ParserCombinators.Parsec

data Literal = Number Int | Alphabet String deriving Show

main = do cs <- getContents
          case parse literals "" cs of
               Right ls -> putStrLn "Literals:" >> print ls
               Left err -> putStrLn "Error:" >> print err

literals = do ls <- sepEndBy1 literal (space <|> newline)
              eof
              return ls

literal = try number <|> alpha

number = do n <- many1 digit
            return $ Number (read n :: Int)

alpha = do a <- many1 letter
           return $ Alphabet a

で、

komamitsu@onion:~/lab/haskell/parse$ runghc parse.hs
123 aaa 987 zzz
Literals:
[Number 123,Alphabet "aaa",Number 987,Alphabet "zzz"]

とか出るだけで嬉しい状態。