Merge branch 'master' of github.com:dopefishh/cc1516
authorMart Lubbers <mart@martlubbers.net>
Mon, 29 Feb 2016 12:55:42 +0000 (13:55 +0100)
committerMart Lubbers <mart@martlubbers.net>
Mon, 29 Feb 2016 12:55:42 +0000 (13:55 +0100)
1  2 
src/parse.icl

diff --combined src/parse.icl
@@@ -12,6 -12,7 +12,7 @@@ import Control.Applicativ
  import Data.Func
  from Data.List import intercalate, replicate, instance Functor []
  from Text import class Text(concat), instance Text String
+ import GenPrint
  
  import yard
  import lex
@@@ -67,6 -68,15 +68,6 @@@ parseStmt = parseIfStmt <|> parseWhileS
                //first pure makes singleton list from the statement
                parseOneLine = liftM pure parseStmt
  
 -parseBBraces :: (Parser Token a) -> Parser Token a
 -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 <|> (liftM (FunType []) parseVoidOrType))
@@@ -91,9 -101,12 +92,9 @@@ parseType 
        trans1 CharTypeToken CharType <|>
        trans1 BoolTypeToken BoolType <|>
        (liftM ListType (parseBSqBraces parseType)) <|>
 -      (liftM2 TupleType 
 -              (satTok BraceOpenToken *> parseType <* satTok CommaToken)
 -              (parseType <* satTok BraceCloseToken)) <|>
 +      (liftM TupleType (parseTuple parseType)) <|>
        (liftM IdType parseIdent)
  
 -//TODO hieronder omzetten naar liftm notatie
  parseExpr :: Parser Token Expr
  parseExpr = //Operators in order of binding strength
        parseOpR (trans1 ColonToken BiCons) $
  
                parseBasicExpr :: Parser Token Expr
                parseBasicExpr = 
 -                      (satTok BraceOpenToken *> parseExpr <* satTok CommaToken 
 -                              >>= \e1->parseExpr <* satTok BraceCloseToken 
 -                              >>= \e2->pure $ TupleExpr e1 e2) <|>
 -                      (parseFunCall >>= \fc->pure $ FunExpr fc) <|>
 +                      (liftM TupleExpr (parseTuple parseExpr)) <|>
 +                      (liftM FunExpr parseFunCall) <|>
                        parseBBraces parseExpr <|>
                        trans1 EmptyListToken EmptyListExpr <|>
 -                      trans2 TrueToken (const $ BoolExpr True) <|>
 -                      trans2 FalseToken (const $ BoolExpr False) <|>
 +                      trans1 TrueToken (BoolExpr True) <|>
 +                      trans1 FalseToken (BoolExpr False) <|>
                        trans2 (NumberToken zero) (\(NumberToken i)->IntExpr i) <|>
                        trans2 (CharToken zero) (\(CharToken c)->CharExpr c) <|>
 -                      (parseOp1 >>= \o->parseExpr >>= \e.pure $ Op1Expr o e) <|>
 -                      (parseVarDef >>= \ve->pure $ VarExpr ve)
 +                      (liftM2 Op1Expr parseOp1 parseExpr) <|>
 +                      (liftM VarExpr parseVarDef)
  
  parseFunCall :: Parser Token FunCall
 -parseFunCall = parseIdent <* satTok BraceOpenToken 
 -      >>= \i->parseSepList CommaToken parseExpr 
 -      <* satTok BraceCloseToken >>= \es->pure $ FunCall i es
 +parseFunCall = liftM2 FunCall
 +      parseIdent (parseBBraces $ parseSepList CommaToken parseExpr)
  
  parseVarDef :: Parser Token VarDef
 -parseVarDef = parseIdent 
 -      >>= \i-> many (satTok DotToken *> (
 +parseVarDef = liftM2 VarDef
 +      parseIdent 
 +      (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))
 -      ) >>= \f->pure $ VarDef i f
 +              (parseIdent >>= \i.if (i == "snd") (pure FieldSnd) empty))))
  
  parseOp1 :: Parser Token Op1
  parseOp1 = trans1 DashToken UnMinus <|> 
        trans1 ExclamationToken UnNegation
  
 +parseBBraces :: (Parser Token a) -> Parser Token a
 +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
 +
 +parseTuple :: (Parser Token a) -> Parser Token (a, a)
 +parseTuple p = satTok BraceOpenToken *> 
 +      (liftM2 (\a->(\b->(a,b))) (p <* satTok CommaToken) p) 
 +      <* satTok BraceCloseToken
 +
  trans2 :: TokenValue (TokenValue -> a) -> Parser Token a
  trans2 t f = satTok t >>= \(_, r).pure (f r)
  
  trans1 :: TokenValue a -> Parser Token a
  trans1 t r = trans2 t $ const r
  
+ derive gPrint TokenValue
  derive gEq TokenValue
  satTok :: TokenValue -> Parser Token Token
- satTok t = satisfy $ eq t
+ satTok t = top >>= \tok=:(pos, tv) -> if (eq t tok) (return tok) (fail <?> (printToString t, pos))
        where
                eq (IdentToken _) (_, IdentToken _) = True
                eq (NumberToken _) (_, NumberToken _) = True
  parseSepList :: TokenValue (Parser Token a) -> Parser Token [a]
  parseSepList sep p = 
        (some (p <* satTok sep) >>= \es->p >>= \e.pure $ reverse [e:es]) <|>
 -      (p >>= \e->pure [e]) <|> pure []
 +      (liftM pure p) <|> pure empty
  
  parseIdent :: Parser Token String
  parseIdent = trans2 (IdentToken []) (\(IdentToken e).toString e)
@@@ -236,7 -239,7 +238,7 @@@ instance print VarDecl wher
        print (VarDecl t i e) = print t ++ [" ":i:"=":print e] ++ [";"]
  
  instance print Type where
 -      print (TupleType t1 t2) = ["(":print t1] ++ [",":print t2] ++ [")"]
 +      print (TupleType (t1, t2)) = ["(":print t1] ++ [",":print t2] ++ [")"]
        print (ListType t) = ["[":print t] ++ ["]"]
        print (IdType s) = print s
        print IntType = print "Int"
@@@ -279,4 -282,4 +281,4 @@@ instance print Expr wher
        print (BoolExpr b) = [toString b]
        print (FunExpr fc) = print fc
        print EmptyListExpr = ["[]"]
 -      print (TupleExpr e1 e2) = ["(":print e1] ++ [",":print e2] ++ [")"]
 +      print (TupleExpr (e1, e2)) = ["(":print e1] ++ [",":print e2] ++ [")"]