所以我仍然在努力使用Parsec,但我正慢慢地将它用于我的工具箱.
当我有一个需要解析的文件时,我发现自己以字符串形式读取文件,然后将内容传递给parsec:
problem <- readFile input
case runParser myParser () input problem of
Left err -> hPutStrLn stderr $ "Error: " ++ show err
Right cs -> -- continue processing...
Run Code Online (Sandbox Code Playgroud)
这似乎是一个相当普遍的模式 - 是否有一些现有的功能,我可以使用a ParsecT String u IO a和a FilePath并解析内容?我在hoogle中找不到任何东西,但这可能只是想象力的失败.
不是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
Run Code Online (Sandbox Code Playgroud)
它仍然有点冗长,但您可以定义一个report常见的地方并在整个程序中使用它; 然后parse是一个单行.
| 归档时间: |
|
| 查看次数: |
2250 次 |
| 最近记录: |