summaryrefslogtreecommitdiff
path: root/src/AST/Pretty.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/AST/Pretty.hs')
-rw-r--r--src/AST/Pretty.hs32
1 files changed, 26 insertions, 6 deletions
diff --git a/src/AST/Pretty.hs b/src/AST/Pretty.hs
index b50506a..acd0dc3 100644
--- a/src/AST/Pretty.hs
+++ b/src/AST/Pretty.hs
@@ -6,7 +6,7 @@
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeOperators #-}
-module AST.Pretty (ppExpr) where
+module AST.Pretty (ppExpr, ppTy) where
import Control.Monad (ap)
import Data.List (intersperse)
@@ -42,10 +42,10 @@ genNameIfUsedIn' prefix ty idx ex
genNameIfUsedIn :: STy a -> Idx env a -> Expr x env t -> M String
genNameIfUsedIn = genNameIfUsedIn' "x"
-ppExpr :: SList STy env -> Expr x env t -> String
+ppExpr :: SList f env -> Expr x env t -> String
ppExpr senv e = fst (runM (mkVal senv >>= \val -> ppExpr' 0 val e) 1) ""
where
- mkVal :: SList STy env -> M (SVal env)
+ mkVal :: SList f env -> M (SVal env)
mkVal SNil = return SNil
mkVal (SCons _ v) = do
val <- mkVal v
@@ -112,14 +112,14 @@ ppExpr' d val = \case
EBuild1 _ a b -> do
a' <- ppExpr' 11 val a
- name <- genNameIfUsedIn (STScal STI64) IZ b
+ name <- genNameIfUsedIn' "i" (STScal STI64) IZ b
b' <- ppExpr' 0 (Const name `SCons` val) b
return $ showParen (d > 10) $
showString "build1 " . a' . showString (" (\\" ++ name ++ " -> ") . b' . showString ")"
EBuild _ n a b -> do
a' <- ppExpr' 11 val a
- name <- genNameIfUsedIn (tTup (sreplicate n tIx)) IZ b
+ name <- genNameIfUsedIn' "i" (tTup (sreplicate n tIx)) IZ b
e' <- ppExpr' 0 (Const name `SCons` val) b
return $ showParen (d > 10) $
showString "build " . a' . showString (" (\\" ++ name ++ " -> ") . e' . showString ")"
@@ -195,7 +195,7 @@ ppExpr' d val = \case
e2' <- ppExpr' 11 val e2
e3' <- ppExpr' 11 val e3
return $ showParen (d > 10) $
- showString ("accum " ++ show (unSNat i) ++ " ") . e1' . showString " " . e2' . showString " " . e3'
+ showString ("accum " ++ show (fromSNat i) ++ " ") . e1' . showString " " . e2' . showString " " . e3'
EZero _ -> return $ showString "zero"
@@ -243,6 +243,26 @@ operator OLt{} = (Infix, "<")
operator OLe{} = (Infix, "<=")
operator OEq{} = (Infix, "==")
operator ONot = (Prefix, "not")
+operator OAnd = (Infix, "&&")
+operator OOr = (Infix, "||")
operator OIf = (Prefix, "ifB")
operator ORound64 = (Prefix, "round")
operator OToFl64 = (Prefix, "toFl64")
+
+ppTy :: Int -> STy t -> String
+ppTy d ty = ppTys d ty ""
+
+ppTys :: Int -> STy t -> ShowS
+ppTys _ STNil = showString "1"
+ppTys d (STPair a b) = showParen (d > 7) $ ppTys 8 a . showString " * " . ppTys 8 b
+ppTys d (STEither a b) = showParen (d > 6) $ ppTys 7 a . showString " + " . ppTys 7 b
+ppTys d (STMaybe t) = showParen (d > 10) $ showString "Maybe " . ppTys 11 t
+ppTys d (STArr n t) = showParen (d > 10) $
+ showString "Arr " . shows (fromSNat n) . showString " " . ppTys 11 t
+ppTys _ (STScal sty) = showString $ case sty of
+ STI32 -> "i32"
+ STI64 -> "i64"
+ STF32 -> "f32"
+ STF64 -> "f64"
+ STBool -> "bool"
+ppTys d (STAccum t) = showParen (d > 10) $ showString "Accum " . ppTys 11 t