printen beetje gefixt
[cc1516.git] / src / parse.icl
index b3046e0..6c888ac 100644 (file)
@@ -12,6 +12,7 @@ import Control.Applicative
 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
@@ -171,9 +172,10 @@ 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
@@ -182,7 +184,7 @@ satTok t = satisfy $ eq t
 
 parseSepList :: TokenValue (Parser Token a) -> Parser Token [a]
 parseSepList sep p = 
-       (some (p <* satTok sep) >>= \es->p >>= \e.pure $ reverse [e:es]) <|>
+       (liftM2 (\es->(\e->reverse [e:es])) (some (p <* satTok sep)) p) <|>
        (liftM pure p) <|> pure empty
 
 parseIdent :: Parser Token String
@@ -202,8 +204,8 @@ instance print FunDecl where
        print (FunDecl i as t vs ss) =
                ["\n", i, " (":printersperse "," as] ++
                [") :: ":print t] ++
-               ["{":printersperse "\n\t" vs] ++
-               ["\n":printStatements ss 1] ++ ["}"]
+               ["{\n\t":printersperse "\n\t" vs] ++
+               ["\n":printStatements ss 1] ++ ["}\n"]
 
 printStatements :: [Stmt] Int -> [String]
 printStatements [] i = []
@@ -220,7 +222,7 @@ printStatements [s:ss] i = (case s of
        ) ++ printStatements ss i
        where
                printCodeBlock :: [Stmt] Int -> [String]
-               printCodeBlock [] _ = ["{}"]
+               printCodeBlock [] _ = ["{}\n"]
                printCodeBlock [x] i = ["\n":printStatements [x] (i+1)]
                printCodeBlock x i =
                        ["{\n":printStatements x (i+1)] ++ indent i ["}\n"]