import lex
parser :: LexerOutput -> ParserOutput
-parser (Left e) = Left $ toString $ LexError e
-parser (Right r) = case runParser parseProgram r of
- (Right p, []) = Right p
- (Right p, x) = Left "Unparsed tokens: "//TODO
- (Left e, _) = Left $ toString e
+parser (Left e) = Left e
+parser (Right r) = fst $ runParser parseProgram r
parseProgram :: Parser Token AST
parseProgram = liftM2 AST (many parseVarDecl) (some parseFunDecl)
<* satTok BraceCloseToken
trans2 :: TokenValue (TokenValue -> a) -> Parser Token a
-trans2 t f = liftM (f o thd3) $ satTok t
+trans2 t f = liftM (\{token}->f token) $ satTok t
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 = top >>= \tok=:(pos1, pos2, tv) -> if (eq t tok)
- (return tok)
- (fail <?> Unexpected (printToString tv) (pos1, pos2))
+satTok t = top >>= \tok=:{line,column,token} -> if (eq t token)
+ (return tok) (fail <?> PositionalError line column ("ParseError: Unexpected token: " +++ printToString token))
where
- eq (IdentToken _) (_, _, IdentToken _) = True
- eq (NumberToken _) (_, _, NumberToken _) = True
- eq (CharToken _) (_, _, CharToken _) = True
- eq x (_, _, y) = gEq {|*|} x y
+ eq (IdentToken _) (IdentToken _) = True
+ eq (NumberToken _) (NumberToken _) = True
+ eq (CharToken _) (CharToken _) = True
+ eq x y = gEq {|*|} x y
parseSepList :: TokenValue (Parser Token a) -> Parser Token [a]
parseSepList sep p =