はじめての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"]
とか出るだけで嬉しい状態。