From 9b0be72fec761d37146288d62bf13a2ace14bbbf Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Thu, 21 Nov 2019 12:55:57 +0100 Subject: Proper string parsing --- Parser.hs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Parser.hs b/Parser.hs index d7f3872..44e58cb 100644 --- a/Parser.hs +++ b/Parser.hs @@ -83,9 +83,23 @@ symbol s = try (string s) >> pWhiteComment pString :: Parser String pString = flip label "string" $ do void $ char '"' - s <- manyTill anyChar (symbol "\"") + s <- manyTill pStringChar (symbol "\"") return s +pStringChar :: Parser Char +pStringChar = + (char '\\' >> ((char 'n' >> return '\n') <|> + (char 'r' >> return '\r') <|> + (char 't' >> return '\t') <|> + (char '0' >> return '\0') <|> + (char 'x' >> pHexDigit >>= \a -> pHexDigit >>= \b -> return (chr (16 * a + b))))) <|> + anyChar + where + pHexDigit :: Parser Int + pHexDigit = (subtract 48 . fromEnum <$> digit) + <|> ((+ (10 - 97)) . ord <$> oneOf "abcdef") + <|> ((+ (10 - 65)) . ord <$> oneOf "ABCDEF") + pWhiteComment :: Parser () pWhiteComment = do pWhitespace -- cgit v1.2.3-54-g00ecf