| Number Integer
| String String
| Bool Bool
+ deriving Show
symbol :: Parser Char
symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
spaces = skipMany space
parseString :: Parser LispVal
-parseString = do
- char '"'
- x <- many (noneOf "\"")
- char '"'
- return $ String x
+parseString = do char '"'
+ x <- many innerChar
+ char '"'
+ return $ String x
+ where innerChar = noneOf ['\\', '\"'] <|> escapeChar
+ escapeChar = do char '\\'
+ c <- oneOf "\""
+ return $ '\"'
parseAtom :: Parser LispVal
parseAtom = do
readExpr :: String -> String
readExpr input = case parse parseExpr "lisp" input of
Left err -> "No match: " ++ show err
- Right val -> "Found value"
+ Right val -> "Found value: " ++ show val
main :: IO ()
main = do
args <- getLine
putStrLn (readExpr args)
+ main