Basic Let functionality
[cc1516.git] / parse.icl
index e13b870..e4bac8b 100644 (file)
--- a/parse.icl
+++ b/parse.icl
@@ -27,14 +27,26 @@ parser ts = case runParser parseProgram ts of
        x = fst x
 
 parseProgram :: Parser Token AST
-parseProgram = AST <$> some parseFunDecl
+parseProgram = many parseLetDecl >>= \fds1->
+                some parseFunDecl >>= \fds2->
+                pure $ AST (fds1++fds2)
+
+parseLetDecl :: Parser Token FunDecl
+parseLetDecl = peekPos >>= \p->
+                satTok LetToken >>|
+                (optional parseFunType) >>= \mt->
+                parseIdent >>= \f->
+                satTok AssignmentToken >>|
+                parseExpr >>= \e->
+                satTok SColonToken >>|
+                pure (FunDecl p f [] mt [] [ReturnStmt $ Just e])
 
 parseFunDecl :: Parser Token FunDecl
 parseFunDecl = liftM6 FunDecl
     (peekPos)
     (parseIdent)
        (parseBBraces $ parseSepList CommaToken parseIdent)
-       (optional parseFunType)
+       (optional (satTok DoubleColonToken *> parseFunType))
        (satTok CBraceOpenToken *> many parseVarDecl)
        (many parseStmt <* satTok CBraceCloseToken)
 
@@ -73,13 +85,14 @@ parseStmt = parseIfStmt <|> parseWhileStmt <|>
                parseOneLine = pure <$> parseStmt
 
 parseFunType :: Parser Token Type
-parseFunType = satTok DoubleColonToken *> parseFT
+parseFunType = parseFT
        where
         parseFT :: Parser Token Type
                parseFT = (liftM2 (->>) (parseSF <* satTok ArrowToken) (parseFT)) <|>
-                       parseSF
+                       parseSF <|> 
+            (FuncType <$> parseType)
                parseSF :: Parser Token Type
-               parseSF = parseBBraces parseFT <|> parseType
+               parseSF = parseBBraces parseFT
 
 parseVarDecl :: Parser Token VarDecl
 parseVarDecl = liftM4 VarDecl
@@ -196,7 +209,8 @@ derive gEq TokenValue
 satTok :: TokenValue -> Parser Token Token
 satTok t = top >>= \tok=:({line,col},token) -> if (eq t token)
        (pure tok) (fail <?> PositionalError line col
-               ("ParseError: Unexpected token: " +++ printToString token))
+               ("ParseError: Unexpected token: " +++ printToString token 
+            +++ "\nExpected: " +++ printToString t))
        where
                eq (IdentToken _) (IdentToken _) = True
                eq (NumberToken _) (NumberToken _) = True