curry gotcha
[cc1516.git] / parse.icl
index 0a88f4e..ebfc7a0 100644 (file)
--- a/parse.icl
+++ b/parse.icl
@@ -116,7 +116,10 @@ parseType =
        (IdType <$> parseIdent)
 
 parseExpr :: Parser Token Expr
-parseExpr = //Operators in order of binding strength
+parseExpr = parseValueExpr <|> parseLambda
+
+parseValueExpr :: Parser Token Expr
+parseValueExpr = //Operators in order of binding strength
        parseOpR (trans1 ColonToken BiCons) $
        parseOpR (trans1 PipesToken BiOr) $
        parseOpR (trans1 AmpersandsToken BiAnd) $
@@ -147,6 +150,7 @@ parseExpr = //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) <|>
@@ -157,6 +161,22 @@ parseExpr = //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 *> many parseIdent)
+                        <*> (satTok ArrowToken *> parseExpr)
+
 makeStrExpr :: Pos [Char] -> Expr
 makeStrExpr p [] = EmptyListExpr p
 makeStrExpr p [x:xs] = Op2Expr p (CharExpr zero x) BiCons (makeStrExpr p xs)
@@ -223,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)