Errors nog steeds niet goede token :(
[cc1516.git] / src / parse.icl
index b3046e0..edc23ac 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
@@ -51,10 +52,11 @@ parseStmt = parseIfStmt <|> parseWhileStmt <|>
 
                parseIfStmt :: Parser Token Stmt
                parseIfStmt = liftM3 IfStmt
-                       (satTok IfToken *> parseBBraces parseExpr)
-                       (parseBlock <|> parseOneLine)
-                       (liftM (fromMaybe []) 
-                               (optional (satTok ElseToken *> (parseBlock<|> parseOneLine))))
+            (satTok IfToken *> parseBBraces parseExpr)
+            (parseBlock <|> parseOneLine)
+            (liftM (fromMaybe []) 
+                (optional (satTok ElseToken *> (parseBlock<|> parseOneLine))))
+
 
                parseWhileStmt :: Parser Token Stmt
                parseWhileStmt = satTok WhileToken *> 
@@ -171,9 +173,12 @@ 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 tv+++printToString t, pos))
        where
                eq (IdentToken _) (_, IdentToken _) = True
                eq (NumberToken _) (_, NumberToken _) = True
@@ -182,7 +187,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 +207,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 +225,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"]