parseProgram :: Parser Token AST
parseProgram = liftM2 AST (many parseVarDecl) (some parseFunDecl)
- <* satTok EndOfFileToken
+// <* satTok EndOfFileToken
parseFunDecl :: Parser Token FunDecl
parseFunDecl = liftM5 FunDecl
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 *>
<* satTok BraceCloseToken
trans2 :: TokenValue (TokenValue -> a) -> Parser Token a
-trans2 t f = liftM (f o snd) $ satTok t
+trans2 t f = liftM (f o thd3) $ 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=:(pos, tv) -> if (eq t tok) (return tok) (fail <?> (printToString tv, pos))
+satTok t = top >>= \tok=:(pos1, pos2, tv) -> if (eq t tok)
+ (return tok)
+ (fail <?> (printToString tv+++printToString t, pos1))
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 =