fix escapes in literal strings
[cc1516.git] / parse.icl
index 46a92e3..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
@@ -41,7 +41,8 @@ parseFunDecl = liftM6 FunDecl
 parseStmt :: Parser Token Stmt
 parseStmt = parseIfStmt <|> parseWhileStmt <|>
        parseSColon parseAssStmt <|> parseSColon parseReturnStmt <|>
-       (parseSColon parseFunCall >>= \(ident, args)->pure $ FunStmt ident args)
+       (parseSColon parseFunCall 
+               >>= \(ident, args, fs)->pure $ FunStmt ident args fs)
        where
                parseSColon :: (Parser Token a) -> Parser Token a
                parseSColon p = p <* satTok SColonToken
@@ -126,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) <|>
@@ -134,24 +136,31 @@ parseExpr = //Operators in order of binding strength
                        trans2 (NumberToken zero) (\(NumberToken i)->IntExpr pos i) <|>
                        trans2 (CharToken zero) (\(CharToken c)->CharExpr pos c) <|>
                        (Op1Expr pos <$> parseOp1 <*> parseExpr) <|>
-                       (parseFunCall >>= \(ident, args)->parseFieldSelectors >>= \fs->
+                       (parseFunCall >>= \(ident, args, fs)->
                                pure $ FunExpr pos ident args fs) <|>
                        (VarExpr pos <$> parseVarDef)
 
-parseFunCall :: Parser Token (String, [Expr])
-parseFunCall = liftM2 tuple 
+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 
        (parseBBraces $ parseSepList CommaToken parseExpr)
+       parseFieldSelectors
 
 parseVarDef :: Parser Token VarDef
 parseVarDef = liftM2 VarDef parseIdent parseFieldSelectors
 
 parseFieldSelectors :: Parser Token [FieldSelector]
-parseFieldSelectors = many (satTok DotToken *> (
-       (parseIdent >>= \i.if (i == "hd") (pure FieldHd) empty) <|>
-       (parseIdent >>= \i.if (i == "tl") (pure FieldTl) empty) <|>
-       (parseIdent >>= \i.if (i == "fst") (pure FieldFst) empty) <|>
-       (parseIdent >>= \i.if (i == "snd") (pure FieldSnd) empty)))
+parseFieldSelectors = many (satTok DotToken *> 
+       parseIdent >>= \i->case i of
+               "hd" = pure FieldHd
+               "tl" = pure FieldTl 
+               "fst" = pure FieldFst
+               "snd" = pure FieldSnd 
+               _ = empty)
 
 parseOp1 :: Parser Token Op1
 parseOp1 = trans1 DashToken UnMinus <|> trans1 ExclamationToken UnNegation
@@ -189,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]
@@ -200,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