haskell Parsec不分析换行符

enyaitl3  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(189)

我有以下代码:

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"


你知道我错过了什么吗

tyky79it

tyky79it1#

问题似乎是你期待一个换行符,但你的文本不包含一个。将eol改为

import Control.Monad (void)

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

字符串
一定会成功的

fwzugrvs

fwzugrvs2#

“\n”是Haskell(和C等)字符串和字符字面量中用于表示ASCII 0x 0A的转义码,该字符用于指示UNIX和类UNIX平台上的行尾。您通常不会使用键盘上的<&gt;或键将此字符放入文件(例如),而是使用键。
在PC-DOS和DOS类系统上,ASCII 0x 0 D后跟ASCII 0x 0A用于行尾,“\r”是ASCII 0x 0 D的转义码。
getLine会一直读取,直到找到行尾,并返回一个包含行尾字符以外的所有字符的字符串。因此,在您的示例中,解析器将无法匹配。您可以通过可选地匹配行尾来修复此问题。

相关问题