| DottedList [LispVal] LispVal
| Number Integer
| String String
+ | Character Char
| Bool Bool
deriving Show
spaces :: Parser ()
spaces = skipMany space
+nonPrintableChar :: Parser Char
+nonPrintableChar = do c <- char '\\' >> oneOf "\\nrtf"
+ return $ case c of '\\' -> '\\'
+ 'n' -> '\n'
+ 'r' -> '\r'
+ 't' -> '\t'
+ 'f' -> '\f'
+
+parseCharacter :: Parser LispVal
+parseCharacter = do char '\''
+ c <- noneOf ['\\', '\''] <|> try singleQuote <|> try nonPrintableChar
+ char '\''
+ return $ Character c
+ where
+ singleQuote = char '\\' >> char '\''
+
parseString :: Parser LispVal
parseString = do char '"'
x <- many innerChar
char '"'
return $ String x
- where innerChar = noneOf ['\\', '\"'] <|> escapeChar
- escapeChar = do char '\\'
- c <- oneOf ['\"', '\\', 'n', 'r', 't', 'f']
- return $ case c of
- '\"' -> '\"'
- '\\' -> '\\'
- 'n' -> '\n'
- 'r' -> '\r'
- 't' -> '\t'
- 'f' -> '\f'
+ where innerChar = noneOf ['\\', '"'] <|> try doubleQuote <|> try nonPrintableChar
+ doubleQuote = char '\\' >> char '"'
parseAtom :: Parser LispVal
parseAtom = do
parseExpr :: Parser LispVal
parseExpr = parseString
+ <|> parseCharacter
<|> parseNumber
<|> parseAtom