Merged branch master
authorpimjager <pim@pimjager.nl>
Mon, 29 Feb 2016 12:45:20 +0000 (13:45 +0100)
committerpimjager <pim@pimjager.nl>
Mon, 29 Feb 2016 12:45:20 +0000 (13:45 +0100)
src/lex.dcl
src/lex.icl
src/main.prj
src/parse.dcl
src/parse.icl

index 0b064b4..2c6f0aa 100644 (file)
@@ -55,6 +55,4 @@ from Data.Either import :: Either
 
 :: LexerOutput :== Either String [Token]
 
-(===) :: TokenValue Token -> Bool
-
 lexer :: [Char] -> LexerOutput
index 99aa37c..32ac048 100644 (file)
@@ -75,49 +75,3 @@ lex t=:[x:xs] = case get x SingleCharTokens of
        | isAlpha x = let (v, r) = span isIdent t in ret (IdentToken v) r
                with isIdent c = isAlphanum c || c == '_'
        | otherwise = err ("Unexpected character: " +++ toString x)
-
-
-(===) :: TokenValue Token -> Bool
-(===) (IdentToken _) (_, IdentToken _) = True
-(===) (NumberToken _) (_, NumberToken _) = True
-(===) (CharToken _) (_, CharToken _) = True
-(===) (VarToken) (_, VarToken) = True
-(===) (ReturnToken) (_, ReturnToken) = True
-(===) (IfToken) (_, IfToken) = True
-(===) (ElseToken) (_, ElseToken) = True
-(===) (WhileToken) (_, WhileToken) = True
-(===) (TrueToken) (_, TrueToken) = True
-(===) (FalseToken) (_, FalseToken) = True
-(===) (VoidToken) (_, VoidToken) = True
-(===) (IntTypeToken) (_, IntTypeToken) = True
-(===) (CharTypeToken) (_, CharTypeToken) = True
-(===) (BoolTypeToken) (_, BoolTypeToken) = True
-(===) (DoubleColonToken) (_, DoubleColonToken) = True
-(===) (NotEqualToken) (_, NotEqualToken) = True
-(===) (LesserEqToken) (_, LesserEqToken) = True
-(===) (GreaterEqToken) (_, GreaterEqToken) = True
-(===) (EqualsToken) (_, EqualsToken) = True
-(===) (AmpersandsToken) (_, AmpersandsToken) = True
-(===) (PipesToken) (_, PipesToken) = True
-(===) (ArrowToken) (_, ArrowToken) = True
-(===) (EmptyListToken) (_, EmptyListToken) = True
-(===) (BraceOpenToken) (_, BraceOpenToken) = True
-(===) (BraceCloseToken) (_, BraceCloseToken) = True
-(===) (CBraceOpenToken) (_, CBraceOpenToken) = True
-(===) (CBraceCloseToken) (_, CBraceCloseToken) = True
-(===) (SquareOpenToken) (_, SquareOpenToken) = True
-(===) (SquareCloseToken) (_, SquareCloseToken) = True
-(===) (CommaToken) (_, CommaToken) = True
-(===) (ColonToken) (_, ColonToken) = True
-(===) (SColonToken) (_, SColonToken) = True
-(===) (DotToken) (_, DotToken) = True
-(===) (PlusToken) (_, PlusToken) = True
-(===) (DashToken) (_, DashToken) = True
-(===) (StarToken) (_, StarToken) = True
-(===) (SlashToken) (_, SlashToken) = True
-(===) (PercentToken) (_, PercentToken) = True
-(===) (AssignmentToken) (_, AssignmentToken) = True
-(===) (LesserToken) (_, LesserToken) = True
-(===) (BiggerToken) (_, BiggerToken) = True
-(===) (ExclamationToken) (_, ExclamationToken) = True
-(===) _ _ = False
index f2d50f9..7ba18dc 100644 (file)
@@ -31,7 +31,6 @@ Global
        Link
                LinkMethod:     Static
                GenerateRelocations:    False
-               GenerateSymbolTable:    False
                GenerateLinkMap:        False
                LinkResources:  False
                ResourceSource: 
@@ -422,7 +421,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Control.Applicative
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -436,7 +435,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Control.Monad
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -450,7 +449,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Either
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -464,7 +463,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Foldable
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -478,7 +477,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Func
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -492,7 +491,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Functor
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -506,7 +505,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.List
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -520,7 +519,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Map
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -534,7 +533,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Maybe
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -548,7 +547,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Monoid
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -562,7 +561,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Set
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -576,7 +575,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Traversable
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -590,7 +589,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Void
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -604,7 +603,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   System.CommandLine
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -618,7 +617,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   System.IO
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -632,7 +631,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   System._Pointer
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -646,7 +645,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Text
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -660,7 +659,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Text.JSON
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -674,7 +673,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Text.PPrint
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -702,7 +701,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   System.OS
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Mac
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Linux-64
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
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 f5cb0c8..9fa1377 100644 (file)
@@ -54,8 +54,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 *> 
@@ -74,39 +74,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) $
@@ -174,8 +174,14 @@ 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 = top >>= \tok=:(pos, tv) -> if (t === tok) (return tok) (fail <?> (printToString t, pos))
+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
+               eq (CharToken _) (_, CharToken _) = True
+               eq x (_, y) = gEq {|*|} x y
 
 parseSepList :: TokenValue (Parser Token a) -> Parser Token [a]
 parseSepList sep p = 
@@ -220,7 +226,7 @@ printStatements [s:ss] i = (case s of
                printCodeBlock [] _ = ["{}"]
                printCodeBlock [x] i = ["\n":printStatements [x] (i+1)]
                printCodeBlock x i =
-                       ["{\n":printStatements x (i+1)] ++ indent i ["}"]
+                       ["{\n":printStatements x (i+1)] ++ indent i ["}\n"]
 
                indent :: Int [String] -> [String]
                indent i rest = replicate i "\t" ++ rest
@@ -230,7 +236,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] ++ [")"]