2012-04-05 5 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 a и FilePath и анализирует содержимое? Я ничего не могу найти в hoogle, но это может быть просто неудачей воображения.

+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 является однострочным.

Смежные вопросы