diff --git a/tests/char.in b/tests/char.in new file mode 100644 index 0000000..e78f028 --- /dev/null +++ b/tests/char.in @@ -0,0 +1 @@ +#\a diff --git a/tests/char.out b/tests/char.out new file mode 100644 index 0000000..5915776 --- /dev/null +++ b/tests/char.out @@ -0,0 +1 @@ +Character 'a' diff --git a/y.hs b/y.hs index 064d8d5..75591bb 100644 --- a/y.hs +++ b/y.hs @@ -8,6 +8,7 @@ data LispVal = Atom String | List [LispVal] | DottedList [LispVal] LispVal | Number Integer + | Character Char | String String | Bool Bool deriving (Show) @@ -18,6 +19,12 @@ symbol = oneOf "!#$%&|*+-/:<=>?@^_~" spaces :: Parser () spaces = skipMany1 space +parseChar :: Parser LispVal +parseChar = do + string "#\\" + c <- anyChar + return $ Character c + parseString :: Parser LispVal parseString = do char '"' @@ -102,6 +109,7 @@ parseNumber = do parseExpr :: Parser LispVal parseExpr = parseString + <|> try parseChar <|> parseNumber <|> parseAtom