import Data.Func
from Data.List import intercalate, replicate, instance Functor []
from Text import class Text(concat), instance Text String
import Data.Func
from Data.List import intercalate, replicate, instance Functor []
from Text import class Text(concat), instance Text String
(Left e, _) = Left $ toString e
parseProgram :: Parser Token AST
(Left e, _) = Left $ toString e
parseProgram :: Parser Token AST
parseFunDecl :: Parser Token FunDecl
parseFunDecl = liftM5 FunDecl
(parseIdent <* satTok BraceOpenToken)
(parseSepList CommaToken parseIdent <* satTok BraceCloseToken)
parseFunDecl :: Parser Token FunDecl
parseFunDecl = liftM5 FunDecl
(parseIdent <* satTok BraceOpenToken)
(parseSepList CommaToken parseIdent <* satTok BraceCloseToken)
- (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))))
+
parseVoidOrType :: Parser Token (Maybe Type)
parseVoidOrType = (satTok VoidToken *> pure Nothing) <|>
parseVoidOrType :: Parser Token (Maybe Type)
parseVoidOrType = (satTok VoidToken *> pure Nothing) <|>
parseBBraces :: (Parser Token a) -> Parser Token a
parseBBraces p = satTok BraceOpenToken *> p <* satTok BraceCloseToken
parseBBraces :: (Parser Token a) -> Parser Token a
parseBBraces p = satTok BraceOpenToken *> p <* satTok BraceCloseToken
where
eq (IdentToken _) (_, IdentToken _) = True
eq (NumberToken _) (_, NumberToken _) = True
where
eq (IdentToken _) (_, IdentToken _) = True
eq (NumberToken _) (_, NumberToken _) = True
instance print FunDecl where
print (FunDecl i as t vs ss) =
["\n", i, " (":printersperse "," as] ++
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] ++ ["}"]
+ [")"] ++ maybe [] (\tt->[" :: ":print tt]) t ++
+ ["{\n\t":printersperse "\n\t" vs] ++
+ ["\n":printStatements ss 1] ++ ["}\n"]
printCodeBlock [x] i = ["\n":printStatements [x] (i+1)]
printCodeBlock x i =
["{\n":printStatements x (i+1)] ++ indent i ["}\n"]
printCodeBlock [x] i = ["\n":printStatements [x] (i+1)]
printCodeBlock x i =
["{\n":printStatements x (i+1)] ++ indent i ["}\n"]