2012-04-05 8 views
2

Also versuche ich immer noch, mich mit Parsec vertraut zu machen, aber ich arbeite langsam an meiner Toolbox.Haskell: Analysiere eine Datei mit Parsec und IO

Wenn ich eine Datei, die ich analysieren müssen haben, finde ich mich um die Datei in als String zu lesen, und dann den Inhalt vorbei nach Parsec:

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

Dies scheint ein recht häufiges Muster obwohl - ist Gibt es eine bestehende Funktion, die ich verwenden kann, die eine ParsecT String u IO a und eine FilePath nimmt und den Inhalt analysiert? Ich kann in hoogle nichts finden, aber das könnte nur ein Mangel an Vorstellungskraft sein.

+1

Es gibt 'parseFromFile' in' Text.Parsec.String' oder 'Text.Parsec.ByteString', aber sie funktionieren nur mit reinen Parsern (z. B.' ParsecT String() Identity a'). – hammar

Antwort

7

Nicht , aber es gibt parseFromFile:: Parser a -> String -> IO (Either ParseError a). Wenn Ihr Code-Snippet jedoch korrekt ist, benötigen Sie die IO in Ihrem Parser nicht, also sollte dies kein Problem sein. So etwas sollte das Verhalten Sie wollen produzieren:

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 

Es ist immer noch ein wenig ausführlich, aber Sie können report irgendwo gemeinsam definieren und verwenden Sie es in Ihrem Programm; dann ist parse ein Einliner.