parser :: LexerOutput -> ParserOutput
parser (Left e) = Left e
-parser (Right r) = fst $ runParser parseProgram r
+parser (Right r) = case runParser parseProgram r of
+ (Right ast, [(p, t):xs]) = Left $ PositionalError p.line p.col (
+ "Unable to parse from: " +++ printToString t)
+ x = fst x
parseProgram :: Parser Token AST
parseProgram = AST <$> (many parseVarDecl) <*> (some parseFunDecl)
parseFunDecl = liftM6 FunDecl
(peekPos)
(parseIdent)
- (satTok BraceOpenToken *> parseSepList CommaToken parseIdent <* satTok BraceCloseToken)
- (optional parseFunType <* satTok CBraceOpenToken)
- (many parseVarDecl)
+ (parseBBraces $ parseSepList CommaToken parseIdent)
+ (optional parseFunType)
+ (satTok CBraceOpenToken *> many parseVarDecl)
(many parseStmt <* satTok CBraceCloseToken)
parseStmt :: Parser Token Stmt
parseStmt = parseIfStmt <|> parseWhileStmt <|>
parseSColon parseAssStmt <|> parseSColon parseReturnStmt <|>
- (liftM FunStmt (parseSColon parseFunCall))
+ (FunStmt <$> parseSColon parseFunCall)
where
parseSColon :: (Parser Token a) -> Parser Token a
parseSColon p = p <* satTok SColonToken
(optional (satTok ElseToken *> (parseBlock<|> parseOneLine))))
parseWhileStmt :: Parser Token Stmt
- parseWhileStmt = satTok WhileToken *>
- (WhileStmt <$> (parseBBraces parseExpr) <*> parseBlock)
+ parseWhileStmt = satTok WhileToken *> (WhileStmt <$>
+ (parseBBraces parseExpr) <*> (parseBlock <|> parseOneLine))
parseBlock :: Parser Token [Stmt]
parseBlock = parseBCBraces (many parseStmt)
parseOneLine :: Parser Token [Stmt]
- //first pure makes singleton list from the statement
parseOneLine = pure <$> parseStmt
parseFunType :: Parser Token FunType
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
parseIdent = trans2 (IdentToken "") (\(IdentToken e).toString e)
//liftM only goes to liftM5
-liftM6 f m1 m2 m3 m4 m5 m6 = f <$> m1 <*> m2 <*> m3 <*> m4 <*> m5 <*> m6
\ No newline at end of file
+liftM6 f m1 m2 m3 m4 m5 m6 = f <$> m1 <*> m2 <*> m3 <*> m4 <*> m5 <*> m6