这是我的任务之一。解析器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"]
这不正确,我无法弄清楚如何处理双引号案件。
答案 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