Added default functions, isEmpty does not typecheck...
[cc1516.git] / parse.icl
index ab575b6..46a92e3 100644 (file)
--- a/parse.icl
+++ b/parse.icl
@@ -75,7 +75,10 @@ parseFunType :: Parser Token Type
 parseFunType = satTok DoubleColonToken *> parseFT
        where
         parseFT :: Parser Token Type
-        parseFT = ((->>) <$> parseType <* satTok ArrowToken <*> parseFT) <|> parseType
+               parseFT = (liftM2 (->>) (parseSF <* satTok ArrowToken) (parseFT)) <|>
+                       parseSF
+               parseSF :: Parser Token Type
+               parseSF = parseBBraces parseFT <|> parseType
 
 parseVarDecl :: Parser Token VarDecl
 parseVarDecl = liftM4 VarDecl
@@ -124,8 +127,6 @@ parseExpr = //Operators in order of binding strength
                parseBasicExpr :: Parser Token Expr
                parseBasicExpr = peekPos >>= \pos ->
                        (TupleExpr pos <$> (parseTuple parseExpr)) <|>
-                       (parseFunCall >>= \(ident, args)->parseFieldSelectors >>= \fs->
-                               pure $ FunExpr pos ident args fs) <|>
                        parseBBraces parseExpr <|>
                        trans1 EmptyListToken (EmptyListExpr pos) <|>
                        trans1 TrueToken (BoolExpr pos True) <|>
@@ -133,21 +134,24 @@ 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->
+                               pure $ FunExpr pos ident args fs) <|>
                        (VarExpr pos <$> parseVarDef)
 
 parseFunCall :: Parser Token (String, [Expr])
-parseFunCall = tuple <$> parseIdent <*> (
-       (parseBBraces $ parseSepList CommaToken parseExpr) <|> pure [])
+parseFunCall = liftM2 tuple 
+       parseIdent 
+       (parseBBraces $ parseSepList CommaToken parseExpr)
 
 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)))
+       (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)))
 
 parseOp1 :: Parser Token Op1
 parseOp1 = trans1 DashToken UnMinus <|> trans1 ExclamationToken UnNegation
@@ -163,7 +167,7 @@ parseBSqBraces p = satTok SquareOpenToken *> p <* satTok SquareCloseToken
 
 parseTuple :: (Parser Token a) -> Parser Token (a, a)
 parseTuple p = satTok BraceOpenToken *>
-       (liftM2 (\a->(\b->(a,b))) (p <* satTok CommaToken) p)
+       (liftM2 tuple (p <* satTok CommaToken) p)
        <* satTok BraceCloseToken
 
 trans :: TokenValue (TokenValue -> a) -> Parser Token (Pos, a)