Parsec没有解析换行符

时间:2014-03-26 18:51:45

标签: haskell parsec

我有以下代码:

import Text.ParserCombinators.Parsec
import Control.Applicative hiding ((<|>))
import Control.Monad

data Test = Test Integer Integer deriving Show

integer :: Parser Integer
integer = rd <$> many1 digit
    where rd = read :: String -> Integer

testParser :: Parser Test
testParser = do
  a <- integer
  char ','
  b <- integer
  eol
  return $ Test a b

eol :: Parser Char
eol = char '\n'

main = forever $ do putStrLn "Enter the value you need to parse: "
                    input <- getLine
                    parseTest testParser input

但是当我真正尝试在ghci中解析我的价值时,它却无法运作。

ghci > main
Enter the value you need to parse: 
34,343\n
parse error at (line 1, column 7):
unexpected "\\"
expecting digit or "\n"

关于我在这里缺少什么的想法?

2 个答案:

答案 0 :(得分:3)

问题似乎是您期望换行,但您的文字不包含换行符。将eol更改为

eol :: Parser ()
eol = void (char '\n') <|> eof

它会起作用。

答案 1 :(得分:1)

“\ n”是Haskell(和C等)字符串和字符文字中使用的转义码,用于表示ASCII 0x0A,该字符用于表示UNIX和类UNIX平台上的行尾。你没有(通常)使用&lt; \&gt;或&lt; n&gt;键盘上的键将此字符放入文件(例如),而不是使用&lt; Enter&gt;键。

在PC-DOS和类似DOS的系统上,ASCII 0x0D后跟ASCII 0x0A用于行尾,“\ r”是用于ASCII 0x0D的转义码。

getLine读取,直到找到行尾并返回包含除行尾字符之外的所有内容的字符串。因此,在您的示例中,您的解析器将无法匹配。您可以通过选择匹配行尾来解决此问题。