diff options
-rw-r--r-- | Parser.hs | 16 |
1 files changed, 15 insertions, 1 deletions
@@ -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 |