如果我有一个解析器将一串由空格分隔的数字读取到整数列表中,那么如何处理尾随空格?目前我有:
\nrow :: Parser [Int]\nrow = do\n optional spaces\n f <- (many (oneOf "0123456789"))\n r <- ((char ' ') >> row) <|> pure []\n pure (read f:r)\nRun Code Online (Sandbox Code Playgroud)\n对于没有尾随空格的字符串效果很好,但对于尾随空格则失败。
\n>\xce\xbb= parse row "" " 2 0 12 3 7"\nRight [2,0,12,3,7]\n\n>\xce\xbb= parse row "" " 2 0 12 3 7 "\nRight [2,0,12,3,7,*** Exception: Prelude.read: no parse\nRun Code Online (Sandbox Code Playgroud)\n这个问题的解决方案是什么,更重要的是,我如何拥有 if'\\n'被消耗然后解析器返回的条件[]
编辑:\n通过阅读@amalloy的答案和parsec源代码,我认为添加一个在这里工作的版本很有用(尽管,@amalloy的建议不要尝试滚动现有函数更有意义)
\nrow :: Parser [Int]\nrow = do\n spaces\n f <- (read <$> many1 digit)\n do\n many1 $ char ' '\n r <- row\n pure (f:r) <|> pure [x]\n <|> pure []\nRun Code Online (Sandbox Code Playgroud)\n
我建议不要自己实现所有这些低级的东西,而是使用sepEndBy. 例如,
row :: Parser [Int]
row = spaces *> (int `sepEndBy` many1 space)
where int = read <$> many1 digit
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |