Haskell:parsec键-值对(键:值)

Haskell:parsec键-值对(键:值),haskell,parsec,Haskell,Parsec,如何使用parsec将包含键和值的文件解析为[[(String,String)]] key1: value 1 key2: value 2 key1: value 1 key2: value 2 key1: value 1 key2: value 2 关键是一个字,价值可以是更多的字 我试过了 tag :: GenParser Char st Tag tag = do name <- key value <- manyTill anyChar (try key) ret

如何使用parsec将包含键和值的文件解析为
[[(String,String)]]

key1: value 1 key2: value 2
key1: value 1 key2: value 2
key1: value 1 key2: value 2
关键是一个字,价值可以是更多的字

我试过了

tag :: GenParser Char st Tag
tag = do
  name <- key
  value <- manyTill anyChar (try key)
  return (name, value)

key :: GenParser Char st String
key = do
  name <- many (noneOf ": ")
  char ':'
  return name

> parse (many tag) "" "key1: value 1 key2: value 2"
Right [("key1"," value 1 ")]
标记::GenParser Char st标记
tag=do

name我已经更改了
标记
函数来测试换行符和下一个键,这对我很有效

tag :: GenParser Char st Tag
tag = do
  name <- key
  value <- manyTill anyChar ((test newline) <|> (test key))
  return (name, strip value)

test :: GenParser Char st a -> GenParser Char st ()
test p = lookAhead $ try p >> return ()

key :: GenParser Char st String
key = do
  name <- many1 (noneOf ": \n\r")
  char ':'
  return name
标记::GenParser Char st标记
tag=do
名称>返回()
key::GenParser Char st String
key=do

如果文件的语法规范不那么模棱两可,我们将不胜感激。
[(“键1”、“值1”)]
结果正确吗?@identity否,该键应该是一个没有空格的单词。