( isCtl -- Char -> Bool
, isSeparator -- Char -> Bool
, isChar -- Char -> Bool
+ , isToken -- Char -> Bool
+ , listOf -- Parser a -> Parser [a]
, token -- Parser String
, lws -- Parser String
, text -- Parser Char
isCtl :: Char -> Bool
isCtl c
| c < '\x1f' = True
- | c == '\x7f' = True
+ | c >= '\x7f' = True
| otherwise = False
| otherwise = False
+isToken :: Char -> Bool
+isToken c = not (isCtl c || isSeparator c)
+
+
+listOf :: Parser a -> Parser [a]
+listOf p = do many lws
+ sepBy p (do many lws
+ char ','
+ many lws)
+
+
token :: Parser String
-token = many1 $ satisfy (\ c -> not (isCtl c || isSeparator c))
+token = many1 $ satisfy isToken
lws :: Parser String
quotedStr = do char '"'
xs <- many (qdtext <|> quotedPair)
char '"'
- return $ foldr (++) "" (["\""] ++ xs ++ ["\""])
+ return $ foldr (++) "" xs
where
- qdtext = char '"' >> fail ""
- <|>
- do c <- text
+ qdtext = do c <- satisfy (/= '"')
return [c]
quotedPair = do q <- char '\\'
c <- satisfy isChar
- return [q, c]
+ return [c]