haskell - 秒差距输入意外结束

标签 haskell parsec

我想解析这样的文件:

66:3 3:4
329:2 
101:3 
495:4 
55:5 
268:5 
267:2 
242:4 
262:1 
861:1 

My code is like the following:

getTestData :: String -> IO [[(Int, Int)]]
getTestData name = do
    --res <- parseFromFile testData (name ++ ".test")
    fc <- readFile (name ++ ".test")
    let res = parse testData "test data" fc
    case res of
        Left e -> error $ show e-- "test data parse eror."
        Right ts -> return ts

eol = char '\n'
testData = endBy line eol
--testData = many line
testTuple = do
    i <- natural
    colon
    r <- natural
    return (fromIntegral i:: Int, fromIntegral r:: Int)

line = sepBy testTuple whiteSpace

但是运行时,它抛出异常:

ts <- getTestData "data" 
*** Exception: "test data" (line 11, column 1):
unexpected end of input
expecting natural or "\n"

我不明白,为什么它说第 11 行,而我的 data.test 文件只有 10 行。所以我尝试了几次都没能解决这个问题。

最佳答案

我最好的猜测是 line 中的 whiteSpace 正在消耗换行符。因此,您的整个文件由单个 line 解析器进行解析,而 eol 解析器永远没有机会接触到 "\n".尝试将 whiteSpace 替换为 many (char ' ') 并查看是否有帮助。

关于haskell - 秒差距输入意外结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6235369/

相关文章:

performance - 启用某些规​​则时,UU-Parsinglib 会急剧变慢

haskell - 为什么 Haskell 会递归导入实例?为什么不只从指定模块导入所有实例?

python - 保留注释并从错误中恢复的解析器

haskell - 为什么 ParsecT 没有 MonadWriter 实例?

parsing - 如何在 Haskell 中解析 float (Parsec.Combinator)

haskell - 使用 makeTokenParser 定义词法分析器时类型推断失败

haskell - Monad Transformer (RandT) 内的多个独立 ST/State monad...复杂的包装/展开

haskell - Haskell 中向量的并行映射

haskell - 使用 foldr 的功能太急切了

haskell - IHP Haskell 字段显示格式双值