2

そのため、私はまだ Parsec を快適に使用できるように努力していますが、ゆっくりとツールボックスに組み込んでいます。

解析する必要があるファイルがある場合、ファイルを文字列として読み取り、その内容を parsec に渡します。

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

ParsecT String u IO aこれはかなり一般的なパターンのようですが、 aと aを取りFilePath、内容を解析するために使用できる既存の関数はありますか? フーグルで何も見つかりませんが、それは単なる想像力の失敗かもしれません。

4

1 に答える 1

7

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

import Text.Parsec.String
import System.Exit
import System.IO

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はワンライナーです。

于 2012-04-05T22:48:26.687 に答える