liftm voor de helft
authorMart Lubbers <mart@martlubbers.net>
Mon, 29 Feb 2016 12:35:02 +0000 (13:35 +0100)
committerMart Lubbers <mart@martlubbers.net>
Mon, 29 Feb 2016 12:35:02 +0000 (13:35 +0100)
src/parse.dcl
src/parse.icl

index baef545..abfb8b4 100644 (file)
@@ -8,7 +8,7 @@ import lex
 :: ParserOutput :== Either String AST
 
 :: AST = AST [VarDecl] [FunDecl]
-:: VarDecl = VarDecl String Type Expr
+:: VarDecl = VarDecl Type String Expr
 :: Type 
        = TupleType Type Type
        | ListType Type
index e60ad17..0f0f42c 100644 (file)
@@ -53,8 +53,8 @@ parseStmt = parseIfStmt <|> parseWhileStmt <|>
                parseIfStmt = liftM3 IfStmt
                        (satTok IfToken *> parseBBraces parseExpr)
                        (parseBlock <|> parseOneLine)
-                       (optional (satTok ElseToken *> (parseBlock <|> parseOneLine)
-                               ) >>= pure o fromMaybe [])
+                       (liftM (fromMaybe []) 
+                               (optional (satTok ElseToken *> (parseBlock<|> parseOneLine))))
 
                parseWhileStmt :: Parser Token Stmt
                parseWhileStmt = satTok WhileToken *> 
@@ -73,39 +73,39 @@ parseBBraces p = satTok BraceOpenToken *> p <* satTok BraceCloseToken
 parseBCBraces :: (Parser Token a) -> Parser Token a
 parseBCBraces p = satTok CBraceOpenToken *> p <* satTok CBraceCloseToken
 
+parseBSqBraces :: (Parser Token a) -> Parser Token a
+parseBSqBraces p = satTok SquareOpenToken *> p <* satTok SquareCloseToken
+
 parseFunType :: Parser Token FunType
-parseFunType = satTok DoubleColonToken *> 
-       (parseInOutType <|> (parseVoidOrType >>= \t->pure $ FunType [] t))
+parseFunType = satTok DoubleColonToken *>
+       (parseInOutType <|> (liftM (FunType []) parseVoidOrType))
        where
                parseInOutType :: Parser Token FunType
-               parseInOutType = some parseType <* satTok ArrowToken
-                       >>= \intypes-> parseVoidOrType
-                       >>= \outtypes->pure $ FunType intypes outtypes
+               parseInOutType = liftM2 FunType 
+                       (some parseType <* satTok ArrowToken) parseVoidOrType
 
                parseVoidOrType :: Parser Token (Maybe Type)
                parseVoidOrType = (satTok VoidToken *> pure Nothing) <|> 
-                       (parseType >>= \type->pure $ Just type)
+                       (liftM Just parseType)
 
 parseVarDecl :: Parser Token VarDecl
-parseVarDecl = 
+parseVarDecl = liftM3 VarDecl
        (parseType <|> trans1 VarToken VarType )
-       >>= \t->parseIdent <* satTok AssignmentToken
-       >>= \i->parseExpr <* satTok SColonToken
-       >>= \e->pure $ VarDecl i t e
+       (parseIdent <* satTok AssignmentToken)
+       (parseExpr <* satTok SColonToken)
 
 parseType :: Parser Token Type
 parseType = 
        trans1 IntTypeToken IntType <|>
        trans1 CharTypeToken CharType <|>
        trans1 BoolTypeToken BoolType <|>
-       (satTok SquareOpenToken *> parseType <* satTok SquareCloseToken 
-               >>= \t.pure $ ListType t) <|>
-       (satTok BraceOpenToken *> parseType <* satTok CommaToken 
-               >>= \t1->parseType <* satTok BraceCloseToken 
-               >>= \t2->pure $ TupleType t1 t2) <|>
-       (parseIdent >>= \e.pure $ IdType e) <|>
-       empty
+       (liftM ListType (parseBSqBraces parseType)) <|>
+       (liftM2 TupleType 
+               (satTok BraceOpenToken *> parseType <* satTok CommaToken)
+               (parseType <* satTok BraceCloseToken)) <|>
+       (liftM IdType parseIdent)
 
+//TODO hieronder omzetten naar liftm notatie
 parseExpr :: Parser Token Expr
 parseExpr = //Operators in order of binding strength
        parseOpR (trans1 ColonToken BiCons) $
@@ -234,7 +234,7 @@ instance print FunType where
                [if (isEmpty at) "" "->":maybe ["Void"] print rt]
 
 instance print VarDecl where
-       print (VarDecl i t e) = print t ++ [" ":i:"=":print e] ++ [";"]
+       print (VarDecl t i e) = print t ++ [" ":i:"=":print e] ++ [";"]
 
 instance print Type where
        print (TupleType t1 t2) = ["(":print t1] ++ [",":print t2] ++ [")"]