fix escapes in literal strings
[cc1516.git] / parse.icl
index bea680b..e13b870 100644 (file)
--- a/parse.icl
+++ b/parse.icl
@@ -1,5 +1,6 @@
 implementation module parse
 
+import GenPrint
 import StdString
 import StdTuple
 import StdList
@@ -14,7 +15,6 @@ import Data.Func
 import StdMisc
 from Data.List import intercalate, replicate, instance Functor []
 from Text import class Text(concat), instance Text String
-import GenPrint
 
 import yard
 import lex
@@ -127,6 +127,7 @@ parseExpr = //Operators in order of binding strength
 
                parseBasicExpr :: Parser Token Expr
                parseBasicExpr = peekPos >>= \pos ->
+                       (trans2 (StringToken []) (\(StringToken cs)->makeStrExpr pos cs)) <|>
                        (TupleExpr pos <$> (parseTuple parseExpr)) <|>
                        parseBBraces parseExpr <|>
                        trans1 EmptyListToken (EmptyListExpr pos) <|>
@@ -139,6 +140,10 @@ parseExpr = //Operators in order of binding strength
                                pure $ FunExpr pos ident args fs) <|>
                        (VarExpr pos <$> parseVarDef)
 
+makeStrExpr :: Pos [Char] -> Expr
+makeStrExpr p [] = EmptyListExpr p
+makeStrExpr p [x:xs] = Op2Expr p (CharExpr zero x) BiCons (makeStrExpr p xs)
+
 parseFunCall :: Parser Token (String, [Expr], [FieldSelector])
 parseFunCall = liftM3 (\x y z->(x, y, z))
        parseIdent 
@@ -193,9 +198,10 @@ satTok t = top >>= \tok=:({line,col},token) -> if (eq t token)
        (pure tok) (fail <?> PositionalError line col
                ("ParseError: Unexpected token: " +++ printToString token))
        where
-               eq (IdentToken _)  (IdentToken _) = True
+               eq (IdentToken _) (IdentToken _) = True
                eq (NumberToken _) (NumberToken _) = True
-               eq (CharToken _)   (CharToken _) = True
+               eq (CharToken _) (CharToken _) = True
+               eq (StringToken _) (StringToken _) = True
                eq x y = gEq {|*|} x y
 
 parseSepList :: TokenValue (Parser Token a) -> Parser Token [a]
@@ -204,7 +210,7 @@ parseSepList sep p =
        (liftM pure p) <|> pure empty
 
 parseIdent :: Parser Token String
-parseIdent = trans2 (IdentToken "") (\(IdentToken e).toString e)
+parseIdent = trans2 (IdentToken "") (\(IdentToken e)->toString e)
 
 //liftM only goes to liftM5
 liftM6 f m1 m2 m3 m4 m5 m6 = f <$> m1 <*> m2 <*> m3 <*> m4 <*> m5 <*> m6