curry gotcha
[cc1516.git] / parse.icl
index a79ad2f..ebfc7a0 100644 (file)
--- a/parse.icl
+++ b/parse.icl
@@ -48,13 +48,16 @@ parseFunDecl = liftM6 FunDecl
        (parseBBraces $ parseSepList CommaToken parseIdent)
        (optional (satTok DoubleColonToken *> parseFunType))
        (satTok CBraceOpenToken *> many parseVarDecl)
-       (many parseStmt <* satTok CBraceCloseToken)
+       (flatten <$> (many parseStmt <* satTok CBraceCloseToken))
 
-parseStmt :: Parser Token Stmt
-parseStmt = parseIfStmt <|> parseWhileStmt <|>
+parseStmt :: Parser Token [Stmt]
+parseStmt = (parseIfStmt <|> parseWhileStmt <|>
        parseSColon parseAssStmt <|> parseSColon parseReturnStmt <|>
        (parseSColon parseFunCall 
-               >>= \(ident, args, fs)->pure $ FunStmt ident args fs)
+               >>= \(ident, args, fs)->pure $ FunStmt ident args fs))
+       >>= \stmt->case stmt of
+               FunStmt "print" args fs = pure $ map (\a->FunStmt "print" [a] []) args
+               s = pure [s]
        where
                parseSColon :: (Parser Token a) -> Parser Token a
                parseSColon p = p <* satTok SColonToken
@@ -79,10 +82,10 @@ parseStmt = parseIfStmt <|> parseWhileStmt <|>
                        (parseBBraces parseExpr) <*> (parseBlock <|> parseOneLine))
 
                parseBlock :: Parser Token [Stmt]
-               parseBlock = parseBCBraces (many parseStmt)
+               parseBlock = parseBCBraces (flatten <$> many parseStmt)
 
                parseOneLine :: Parser Token [Stmt]
-               parseOneLine = pure <$> parseStmt
+               parseOneLine = parseStmt
 
 parseFunType :: Parser Token Type
 parseFunType = parseFT >>= \t -> case t of
@@ -114,6 +117,7 @@ parseType =
 
 parseExpr :: Parser Token Expr
 parseExpr = parseValueExpr <|> parseLambda
+
 parseValueExpr :: Parser Token Expr
 parseValueExpr = //Operators in order of binding strength
        parseOpR (trans1 ColonToken BiCons) $
@@ -146,6 +150,7 @@ parseValueExpr = //Operators in order of binding strength
                        (trans2 (StringToken []) (\(StringToken cs)->makeStrExpr pos cs)) <|>
                        (TupleExpr pos <$> (parseTuple parseExpr)) <|>
                        parseBBraces parseExpr <|>
+            parseListLiteral <|>
                        trans1 EmptyListToken (EmptyListExpr pos) <|>
                        trans1 TrueToken (BoolExpr pos True) <|>
                        trans1 FalseToken (BoolExpr pos False) <|>
@@ -156,9 +161,20 @@ parseValueExpr = //Operators in order of binding strength
                                pure $ FunExpr pos ident args fs) <|>
                        (VarExpr pos <$> parseVarDef)
 
+        parseListLiteral :: Parser Token Expr
+        parseListLiteral = peekPos >>= \p->
+            satTok SquareOpenToken >>| 
+            many (parseExpr <* satTok CommaToken) >>= \es->
+            parseExpr >>= \e->
+            foldM   (\res e-> pure $ Op2Expr p e BiCons res) 
+                    (EmptyListExpr p) 
+                    [e : reverse es] >>= \res->
+            satTok SquareCloseToken >>| 
+            pure res
+
 parseLambda :: Parser Token Expr
 parseLambda = LambdaExpr <$> peekPos 
-                        <*> (satTok BackslashToken *> some parseIdent)
+                        <*> (satTok BackslashToken *> many parseIdent)
                         <*> (satTok ArrowToken *> parseExpr)
 
 makeStrExpr :: Pos [Char] -> Expr
@@ -227,9 +243,9 @@ tokEq (StringToken _) (StringToken _) = True
 tokEq x y = gEq {|*|} x y
 
 parseSepList :: TokenValue (Parser Token a) -> Parser Token [a]
-parseSepList sep p =
-       (liftM2 (\es->(\e->reverse [e:es])) (some (p <* satTok sep)) p) <|>
-       (liftM pure p) <|> pure empty
+parseSepList sep p = pSL` sep p <|> pure []
+       where 
+               pSL` sep p = (p <* satTok sep >>= \v1->parseSepList sep p >>= \vs->pure [v1:vs]) <|> (p >>= \v->pure [v])
 
 parseIdent :: Parser Token String
 parseIdent = trans2 (IdentToken "") (\(IdentToken e)->toString e)