import lex
import AST
-parser :: LexerOutput -> ParserOutput
-parser (Left e) = Left e
-parser (Right r) = case runParser parseProgram r of
+parser :: [Token] -> ParserOutput
+parser ts = case runParser parseProgram ts of
(Right ast, [(p, t):xs]) = Left $ PositionalError p.line p.col (
"Unable to parse from: " +++ printToString t)
x = fst x
parseBlock = parseBCBraces (many parseStmt)
parseOneLine :: Parser Token [Stmt]
- //first pure makes singleton list from the statement
parseOneLine = pure <$> parseStmt
-parseFunType :: Parser Token FunType
-parseFunType = satTok DoubleColonToken *>
- (parseInOutType <|> ((FunType []) <$> parseVoidOrType))
+parseFunType :: Parser Token Type
+parseFunType = satTok DoubleColonToken *> parseFT
where
- parseInOutType :: Parser Token FunType
- parseInOutType = FunType <$> (some parseType <* satTok ArrowToken) <*> parseVoidOrType
-
- parseVoidOrType :: Parser Token (Maybe Type)
- parseVoidOrType = (satTok VoidToken *> pure Nothing) <|>
- (Just <$> parseType) <|> pure Nothing
+ parseFT :: Parser Token Type
+ parseFT = ((->>) <$> parseType <* satTok ArrowToken <*> parseFT) <|> parseType
parseVarDecl :: Parser Token VarDecl
parseVarDecl = liftM4 VarDecl
trans1 IntTypeToken IntType <|>
trans1 CharTypeToken CharType <|>
trans1 BoolTypeToken BoolType <|>
+ trans1 VoidToken VoidType <|>
(ListType <$> (parseBSqBraces parseType)) <|>
(TupleType <$> (parseTuple parseType)) <|>
(IdType <$> parseIdent)
parseOpL :: (Parser Token Op2) (Parser Token Expr) -> Parser Token Expr
parseOpL ops prev = peekPos >>= \pos-> prev >>= \e1->many (
- ops >>= \op->prev >>= \e->pure (op, e)
- ) >>= \moe->foldM (\e->(\(op,e2)->pure $ Op2Expr pos e op e2)) e1 moe
+ ops >>= \op->prev >>= \e->pure (op, e))
+ >>= \moe->foldM (\e->(\(op,e2)->pure $ Op2Expr pos e op e2)) e1 moe
parseBasicExpr :: Parser Token Expr
parseBasicExpr = peekPos >>= \pos ->
(VarExpr pos <$> parseVarDef)
parseFunCall :: Parser Token FunCall
-parseFunCall = FunCall <$> parseIdent <*> (parseBBraces $ parseSepList CommaToken parseExpr)
+parseFunCall = FunCall <$> parseIdent <*>
+ (parseBBraces $ parseSepList CommaToken parseExpr)
parseVarDef :: Parser Token VarDef
parseVarDef = liftM2 VarDef