使用parsec以分号解析字符串

时间:2017-04-10 07:36:08

标签: haskell parsec

这是我的任务之一。解析器getList假设下一步工作

GHCi> parseTest getList "1;234;56"
["1","234","56"]
GHCi> parseTest getList "1;234;56;"
parse error at (line 1, column 10):
unexpected end of input
expecting digit
GHCi> parseTest getList "1;;234;56"
parse error at (line 1, column 3):
unexpected ";"
expecting digit

我的解决方案getList = many digit `sepBy1` char ';'正在像这样工作

*Main> test1
["1","234","56"]
*Main> test2
["1","234","56",""]
*Main> test3
["1","","234","56"]

这不正确,我无法弄清楚如何处理双引号案件。

3 个答案:

答案 0 :(得分:2)

你的问题是什么many digit它的解析器接受零个或多个数字。例如,您应该使用many1 digit。所以一起:

getList = many1 digit `sepBy` char ';'

答案 1 :(得分:1)

使用megaparsec(我建议超过parsec):

getList = some digitChar `sepBy1` char ';'

这意味着“至少一个数字,至少一次,以分号分隔”。请注意,我正在使用some,您尝试使用many

ghci> parse getList "" "123;456"
Right ["123", "456"]
ghci> parse getList "" "123;;456"
Left (ParseError {errorPos = SourcePos {sourceName = "", sourceLine = Pos 1, sourceColumn = Pos 5} :| [], errorUnexpected = fromList [Tokens (';' :| "")], errorExpected = fromList [Label ('d' :| "igit")], errorCustom = fromList []})

答案 2 :(得分:0)

试试这个:

getList = do
    many1 digit
    many $ do
       char ';'
       many1 digit