git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Char literals
commit5afb6e09f53881c3491785938a80dad88d9ef096 authorPhil Freeman <paf31@cantab.net> dateFri 24 Apr 2015, 12:31 (12 years ago) parentfb12693
9 files changed+47
src/Language/PureScript/AST/Binders.hs+4 src/Language/PureScript/AST/Declarations.hs+4 src/Language/PureScript/CodeGen/JS.hs+3 src/Language/PureScript/CoreFn/Desugar.hs+4 src/Language/PureScript/CoreFn/Literals.hs+4 src/Language/PureScript/Parser/Declarations.hs+9 src/Language/PureScript/Parser/Lexer.hs+13 src/Language/PureScript/Pretty/Values.hs+2 src/Language/PureScript/TypeChecker/Types.hs+4
src/Language/PureScript/AST/Binders.hs+4
@@ -39,6 +39,10 @@ data Binder
3939 --
4040 | StringBinder String
4141 -- |
42+ -- A binder which matches a character literal
43+ --
44+ | CharBinder Char
45+ -- |
4246 -- A binder which matches a numeric literal
4347 --
4448 | NumberBinder (Either Integer Double)
src/Language/PureScript/AST/Declarations.hs+4
@@ -302,6 +302,10 @@ data Expr
302302 --
303303 | StringLiteral String
304304 -- |
305+ -- A character literal
306+ --
307+ | CharLiteral Char
308+ -- |
305309 -- A boolean literal
306310 --
307311 | BooleanLiteral Bool
src/Language/PureScript/CodeGen/JS.hs+3
@@ -205,6 +205,7 @@ moduleToJs (Module coms mn imps exps foreigns decls) = do
205205 literalToValueJS :: Literal (Expr Ann) -> m JS
206206 literalToValueJS (NumericLiteral n) = return $ JSNumericLiteral n
207207 literalToValueJS (StringLiteral s) = return $ JSStringLiteral s
208+ literalToValueJS (CharLiteral c) = return $ JSStringLiteral [c]
208209 literalToValueJS (BooleanLiteral b) = return $ JSBooleanLiteral b
209210 literalToValueJS (ArrayLiteral xs) = JSArrayLiteral <$> mapM valueToJs xs
210211 literalToValueJS (ObjectLiteral ps) = JSObjectLiteral <$> mapM (sndM valueToJs) ps
@@ -327,6 +328,8 @@ moduleToJs (Module coms mn imps exps foreigns decls) = do
327328 literalToBinderJS :: String -> [JS] -> Literal (Binder Ann) -> m [JS]
328329 literalToBinderJS varName done (NumericLiteral num) =
329330 return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSNumericLiteral num)) (JSBlock done) Nothing]
331+ literalToBinderJS varName done (CharLiteral c) =
332+ return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSStringLiteral [c])) (JSBlock done) Nothing]
330333 literalToBinderJS varName done (StringLiteral str) =
331334 return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSStringLiteral str)) (JSBlock done) Nothing]
332335 literalToBinderJS varName done (BooleanLiteral True) =
src/Language/PureScript/CoreFn/Desugar.hs+4
@@ -83,6 +83,8 @@ moduleToCoreFn env (A.Module coms mn decls (Just exps)) =
8383 Literal (ss, com, ty, Nothing) (NumericLiteral v)
8484 exprToCoreFn ss com ty (A.StringLiteral v) =
8585 Literal (ss, com, ty, Nothing) (StringLiteral v)
86+ exprToCoreFn ss com ty (A.CharLiteral v) =
87+ Literal (ss, com, ty, Nothing) (CharLiteral v)
8688 exprToCoreFn ss com ty (A.BooleanLiteral v) =
8789 Literal (ss, com, ty, Nothing) (BooleanLiteral v)
8890 exprToCoreFn ss com ty (A.ArrayLiteral vs) =
@@ -147,6 +149,8 @@ moduleToCoreFn env (A.Module coms mn decls (Just exps)) =
147149 LiteralBinder (ss, com, Nothing, Nothing) (BooleanLiteral b)
148150 binderToCoreFn ss com (A.StringBinder s) =
149151 LiteralBinder (ss, com, Nothing, Nothing) (StringLiteral s)
152+ binderToCoreFn ss com (A.CharBinder c) =
153+ LiteralBinder (ss, com, Nothing, Nothing) (CharLiteral c)
150154 binderToCoreFn ss com (A.NumberBinder n) =
151155 LiteralBinder (ss, com, Nothing, Nothing) (NumericLiteral n)
152156 binderToCoreFn ss com (A.VarBinder name) =
src/Language/PureScript/CoreFn/Literals.hs+4
@@ -33,6 +33,10 @@ data Literal a
3333 --
3434 | StringLiteral String
3535 -- |
36+ -- A character literal
37+ --
38+ | CharLiteral Char
39+ -- |
3640 -- A boolean literal
3741 --
3842 | BooleanLiteral Bool
src/Language/PureScript/Parser/Declarations.hs+9
@@ -284,6 +284,9 @@ booleanLiteral = (reserved "true" >> return True) P.<|> (reserved "false" >> ret
284284parseNumericLiteral :: TokenParser Expr
285285parseNumericLiteral = NumericLiteral <$> number
286286
287+parseCharLiteral :: TokenParser Expr
288+parseCharLiteral = CharLiteral <$> charLiteral
289+
287290parseStringLiteral :: TokenParser Expr
288291parseStringLiteral = StringLiteral <$> stringLiteral
289292
@@ -350,6 +353,7 @@ parseLet = do
350353parseValueAtom :: TokenParser Expr
351354parseValueAtom = P.choice
352355 [ P.try parseNumericLiteral
356+ , P.try parseCharLiteral
353357 , P.try parseStringLiteral
354358 , P.try parseBooleanLiteral
355359 , parseArrayLiteral
@@ -442,6 +446,9 @@ parseObjectUpdaterWildcard = underscore *> C.indented *> parseUpdaterBody Nothin
442446parseStringBinder :: TokenParser Binder
443447parseStringBinder = StringBinder <$> stringLiteral
444448
449+parseCharBinder :: TokenParser Binder
450+parseCharBinder = CharBinder <$> charLiteral
451+
445452parseBooleanBinder :: TokenParser Binder
446453parseBooleanBinder = BooleanBinder <$> booleanLiteral
447454
@@ -492,6 +499,7 @@ parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators
492499 parseBinderAtom :: TokenParser Binder
493500 parseBinderAtom = P.choice (map P.try
494501 [ parseNullBinder
502+ , parseCharBinder
495503 , parseStringBinder
496504 , parseBooleanBinder
497505 , parseNumberBinder
@@ -508,6 +516,7 @@ parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators
508516parseBinderNoParens :: TokenParser Binder
509517parseBinderNoParens = P.choice (map P.try
510518 [ parseNullBinder
519+ , parseCharBinder
511520 , parseStringBinder
512521 , parseBooleanBinder
513522 , parseNumberBinder
src/Language/PureScript/Parser/Lexer.hs+13
@@ -61,6 +61,7 @@ module Language.PureScript.Parser.Lexer
6161 , symbol
6262 , symbol'
6363 , identifier
64+ , charLiteral
6465 , stringLiteral
6566 , number
6667 , natural
@@ -111,6 +112,7 @@ data Token
111112 | UName String
112113 | Qualifier String
113114 | Symbol String
115+ | CharLiteral Char
114116 | StringLiteral String
115117 | Number (Either Integer Double)
116118 deriving (Show, Eq, Ord)
@@ -141,6 +143,7 @@ prettyPrintToken (LName s) = show s
141143prettyPrintToken (UName s) = show s
142144prettyPrintToken (Qualifier _) = "qualifier"
143145prettyPrintToken (Symbol s) = s
146+prettyPrintToken (CharLiteral c) = show c
144147prettyPrintToken (StringLiteral s) = show s
145148prettyPrintToken (Number n) = either show show n
146149
@@ -204,6 +207,7 @@ parseToken = P.choice
204207 , do uName <- parseUName
205208 (guard (validModuleName uName) >> Qualifier uName <$ P.char '.') <|> pure (UName uName)
206209 , Symbol <$> parseSymbol
210+ , CharLiteral <$> parseCharLiteral
207211 , StringLiteral <$> parseStringLiteral
208212 , Number <$> parseNumber
209213 ] <* whitespace
@@ -230,6 +234,9 @@ parseToken = P.choice
230234 symbolChar :: P.Parsec String u Char
231235 symbolChar = P.oneOf opChars
232236
237+ parseCharLiteral :: P.Parsec String u Char
238+ parseCharLiteral = PT.charLiteral tokenParser
239+
233240 parseStringLiteral :: P.Parsec String u String
234241 parseStringLiteral = blockString <|> PT.stringLiteral tokenParser
235242 where
@@ -433,6 +440,12 @@ symbol' s = token go P.<?> show s
433440 go LFatArrow | s == "<=" = Just ()
434441 go _ = Nothing
435442
443+charLiteral :: TokenParser Char
444+charLiteral = token go P.<?> "char literal"
445+ where
446+ go (CharLiteral c) = Just c
447+ go _ = Nothing
448+
436449stringLiteral :: TokenParser String
437450stringLiteral = token go P.<?> "string literal"
438451 where
src/Language/PureScript/Pretty/Values.hs+2
@@ -37,6 +37,7 @@ literals = mkPattern' match
3737 match :: Expr -> StateT PrinterState Maybe String
3838 match (NumericLiteral n) = return $ either show show n
3939 match (StringLiteral s) = return $ show s
40+ match (CharLiteral c) = return $ show c
4041 match (BooleanLiteral True) = return "true"
4142 match (BooleanLiteral False) = return "false"
4243 match (ArrayLiteral xs) = concat <$> sequence
@@ -193,6 +194,7 @@ prettyPrintBinderAtom = mkPattern' match
193194 match :: Binder -> StateT PrinterState Maybe String
194195 match NullBinder = return "_"
195196 match (StringBinder str) = return $ show str
197+ match (CharBinder c) = return $ show c
196198 match (NumberBinder num) = return $ either show show num
197199 match (BooleanBinder True) = return "true"
198200 match (BooleanBinder False) = return "false"
src/Language/PureScript/TypeChecker/Types.hs+4
@@ -215,6 +215,7 @@ infer' :: Expr -> UnifyT Type Check Expr
215215infer' v@(NumericLiteral (Left _)) = return $ TypedValue True v tyInt
216216infer' v@(NumericLiteral (Right _)) = return $ TypedValue True v tyNumber
217217infer' v@(StringLiteral _) = return $ TypedValue True v tyString
218+infer' v@(CharLiteral _) = return $ TypedValue True v tyChar
218219infer' v@(BooleanLiteral _) = return $ TypedValue True v tyBoolean
219220infer' (ArrayLiteral vals) = do
220221 ts <- mapM infer vals
@@ -351,6 +352,7 @@ inferProperty _ _ = return Nothing
351352inferBinder :: Type -> Binder -> UnifyT Type Check (M.Map Ident Type)
352353inferBinder _ NullBinder = return M.empty
353354inferBinder val (StringBinder _) = val =?= tyString >> return M.empty
355+inferBinder val (CharBinder _) = val =?= tyChar >> return M.empty
354356inferBinder val (NumberBinder (Left _)) = val =?= tyInt >> return M.empty
355357inferBinder val (NumberBinder (Right _)) = val =?= tyNumber >> return M.empty
356358inferBinder val (BooleanBinder _) = val =?= tyBoolean >> return M.empty
@@ -466,6 +468,8 @@ check' v@(NumericLiteral (Right _)) t | t == tyNumber =
466468 return $ TypedValue True v t
467469check' v@(StringLiteral _) t | t == tyString =
468470 return $ TypedValue True v t
471+check' v@(CharLiteral _) t | t == tyChar =
472+ return $ TypedValue True v t
469473check' v@(BooleanLiteral _) t | t == tyBoolean =
470474 return $ TypedValue True v t
471475check' (ArrayLiteral vals) t@(TypeApp a ty) = do