2012-04-05 11 views
2

私はまだParsecを使って快適にしようとしていますが、ツールボックスにゆっくりと取り組んでいます。Haskell:ParsecとIOを使ってファイルを解析する

私は私が解析する必要があるファイルを持っているとき、私は自分自身を文字列としてでファイルを読み込み、その後、パーセクにコンテンツを渡す見つける:

problem <- readFile input        
case runParser myParser() input problem of 
    Left err -> hPutStrLn stderr $ "Error: " ++ show err 
    Right cs -> -- continue processing... 

これはしかしかなり一般的なパターンのように思える - されますそこにはParsecT String u IO aFilePathをとり、内容を解析する既存の機能がありますか?私はホグルで何かを見つけることができませんが、それはちょうど想像力の失敗かもしれません。

+1

'Text.Parsec.String'や' Text.Parsec.ByteString'に 'parseFromFile'がありますが、それらは純粋なパーサ(例えば' ParsecT String()Identity a')だけで動作します。 – hammar

答えて

7

であるが、parseFromFile:: Parser a -> String -> IO (Either ParseError a)がある。ただし、コードスニペットが正確であれば、実際にはパーサーにIOが必要なわけではないので、これは問題ではありません。このような何かをしたい動作を生成する必要があります

import Text.Parsec.String 
import System.Exit 

parse :: Parser a -> String -> IO a 
parse p fileName = parseFromFile p fileName >>= either report return 
    where 
    report err = do 
     hPutStrLn stderr $ "Error: " ++ show err 
     exitFailure 

は、それはまだ少し冗長ですが、あなたは一般的なreportどこかを定義し、プログラム全体でそれを使用することができます。 parseは1ライナーです。

関連する問題