-- ==========================================================-- -- === Pretty-printer prettyprint.m (1) ===-- -- ==========================================================-- module PrettyPrint where import BaseDefs import Utils import MyUtils -- ==========================================================-- -- ppPrintCExpr :: CExpr -> [Char] ppPrintCExpr = utiMkStr . ppPrintCExprMain -- ==========================================================-- -- ppPrintCExprMain (EVar v) = utiStr v ppPrintCExprMain (ENum n) = utiNum n ppPrintCExprMain (EConstr c) = utiStr c ppPrintCExprMain (EAp e1 e2) = (ppPrintLAp e1) `utiAppend` ((utiStr " ") `utiAppend` (ppPrintRAp e2)) ppPrintCExprMain (ELet isRec ds e) = (utiStr "let") `utiAppend` (rec `utiAppend` ((utiIndent (utiInterleave (utiStr ";\n") [(utiStr n) `utiAppend` ((utiStr " = ") `utiAppend` (ppPrintCExprMain e)) | (n,e) <- ds] ) ) `utiAppend` ((utiStr "\nin ") `utiAppend` (ppPrintCExprMain e)))) where rec | isRec = utiStr "rec\n " | otherwise = utiStr "\n " ppPrintCExprMain (ELam vs e) = (utiStr "\\") `utiAppend` ((utiInterleave (utiStr " ") (map utiStr vs)) `utiAppend` ((utiStr " -> ") `utiAppend` (utiIndent (ppPrintCExprMain e)))) ppPrintCExprMain (ECase sw al) = (utiStr "case ") `utiAppend` ((ppPrintCExprMain sw) `utiAppend` ((utiStr " of\n" ) `utiAppend` ((utiIndent (utiInterleave (utiStr ";\n") (map ppPrintAlter al) ) ) `utiAppend` (utiStr "\nend")))) -- ==========================================================-- -- ppPrintAlter (cn, (cal, cexp)) = (utiStr " ") `utiAppend` ((utiStr cn) `utiAppend` ((utiStr " ") `utiAppend` ((utiInterleave (utiStr " ") [(utiStr ca) | ca <- cal]) `utiAppend` ((utiStr " -> ") `utiAppend` ((utiIndent (ppPrintCExprMain cexp))))))) -- ==========================================================-- -- ppPrintRAp (EVar v) = utiStr v ppPrintRAp (ENum n) = utiNum n ppPrintRAp (EConstr c) = utiStr c ppPrintRAp e = (utiStr "(") `utiAppend` ((ppPrintCExprMain e) `utiAppend` (utiStr ")")) -- ==========================================================-- -- ppPrintLAp (EVar v) = utiStr v ppPrintLAp (ENum n) = utiNum n ppPrintLAp (EConstr c) = utiStr c ppPrintLAp (EAp e1 e2) = (ppPrintLAp e1) `utiAppend` ((utiStr " ") `utiAppend` (ppPrintRAp e2)) ppPrintLAp e = (utiStr "(") `utiAppend` ((ppPrintCExprMain e) `utiAppend` (utiStr ")")) -- ==========================================================-- -- ppPrintTypeDef :: TypeDef -> [Char] ppPrintTypeDef = utiMkStr . ppPrintTypeDefMain ppPrintTypeDefMain (tn, tal, tcl) = (utiStr tn) `utiAppend` ((utiStr " ") `utiAppend` ((utiInterleave (utiStr " ") (map utiStr tal)) `utiAppend` ((utiStr " ::= ") `utiAppend` ((utiIndent (utiInterleave (utiStr " |\n") (map ppPrintConstrAlt tcl) ) ))))) -- ==========================================================-- -- ppPrintConstrAlt (cn, ctes) = (utiStr cn) `utiAppend` ((utiStr " ") `utiAppend` ((utiInterleave (utiStr " ") (map ppPrintTDefExpr ctes) ))) -- ==========================================================-- -- ppPrintTDefExpr (TDefVar n) = utiStr n ppPrintTDefExpr (TDefCons n te) = (utiStr "(") `utiAppend` ((utiStr n) `utiAppend` ((utiStr " ") `utiAppend` ((utiInterleave (utiStr " ") (map ppPrintTDefExpr te)) `utiAppend` ((utiStr ")" ))))) -- ==========================================================-- -- ppPrintParsed :: AtomicProgram -> [Char] ppPrintParsed (tds, ce) = (tdsChars tds) ++ ";;\n\n" ++ (ppPrintCExpr ce) where tdsChars [] = "" tdsChars (t:ts) = "\n" ++ (ppPrintTypeDef t) ++ ";\n\n" ++ (tdsChars ts) -- ==========================================================-- -- === End prettyprint.m (1) ===-- -- ==========================================================--