From b6f03e953ba007f17c2f766ef0a1f2dee72a2474 Mon Sep 17 00:00:00 2001 From: sebastianselander Date: Thu, 9 Feb 2023 09:42:44 +0100 Subject: [PATCH] deprecated branch --- language | 1 + src/Abs.hs | 20 +++++++++ src/Rename/Renamer.hs | 96 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 120000 language create mode 100644 src/Abs.hs create mode 100644 src/Rename/Renamer.hs diff --git a/language b/language new file mode 120000 index 0000000..29e6f1c --- /dev/null +++ b/language @@ -0,0 +1 @@ +/home/sebastian/.cabal/store/ghc-9.4.4/language-0.1.0.0-e-language-b98a5580bec9e5cee0ea5d675b3788bf6eec0b9eb955374c9ba250c1d3b935fc/bin/language \ No newline at end of file diff --git a/src/Abs.hs b/src/Abs.hs new file mode 100644 index 0000000..35e2904 --- /dev/null +++ b/src/Abs.hs @@ -0,0 +1,20 @@ +{-# LANGUAGE TypeFamilies, StandaloneDeriving #-} + +module Abs where + +data Exp eps + = EInt (XInt eps) Integer + | EId (XId eps) String + | EAdd (XAdd eps) (Exp eps) (Exp eps) + | EApp (XApp eps) (Exp eps) (Exp eps) + | EAbs (XAbs eps) String (Exp eps) + | EExp (XExp eps) + +newtype Ident = Ident String + +type family XInt eps +type family XId eps +type family XAdd eps +type family XApp eps +type family XAbs eps +type family XExp eps diff --git a/src/Rename/Renamer.hs b/src/Rename/Renamer.hs new file mode 100644 index 0000000..a6cf12d --- /dev/null +++ b/src/Rename/Renamer.hs @@ -0,0 +1,96 @@ +{-# LANGUAGE OverloadedRecordDot, LambdaCase, TypeFamilies, PatternSynonyms #-} + +module Rename.Renamer where + +import Abs + +import qualified Grammar.Abs as A +import Grammar.ErrM (Err) +import Control.Monad.Except (throwError) +import Grammar.Print (printTree) +import Control.Monad.State +import qualified Data.Map as M +import Data.Map (Map) +import qualified Data.Set as S +import Data.Set (Set) + +------------------ DATA TYPES ------------------ + +type Rn a = StateT Env Err a + +data Env = Env { uniques :: Map String Unique + , nextUnique :: Unique + , sig :: Set String + } + +newtype Unique = Unique Int + deriving Enum + +data Name = Nu Unique | Ni String + +initEnv :: Env +initEnv = Env + { uniques = mempty + , nextUnique = Unique 0 + , sig = mempty + } + +findBind :: String -> Rn Name +findBind x = lookupUnique x >>= \case + Just u -> pure $ Nu u + Nothing -> gets (S.member x . sig) >>= \case + False -> throwError ("Unbound variable " ++ printTree x) + True -> pure $ Ni x + +newUnique :: String -> Rn Unique +newUnique x = do + u <- gets nextUnique + modify $ \env -> env { nextUnique = succ u + , uniques = M.insert x u env.uniques } + return u + +lookupUnique :: String -> Rn (Maybe Unique) +lookupUnique x = gets (M.lookup x . uniques) + +renameDef :: Def -> Rn Def +renameDef = \case + DExp x t _ xs e -> do + newSig x + xs' <- mapM newUnique xs + e' <- renameExp e + let e'' = foldr ($) e' . zipWith R.EAbs xs' $ fromTree t + pure . R.DBind $ R.Bind x t e'' + +renameExp :: A.Exp -> Rn ExpRE +renameExp e = + case e of + A.EInt i -> pure (EIntR i) + A.EId (A.Ident str) -> flip EIdR str <$> findBind str + A.EAdd e1 e2 -> EAppR <$> renameExp e1 <*> renameExp e2 + A.EApp e1 e2 -> EAppR <$> renameExp e1 <*> renameExp e2 + A.EAbs (A.Ident x) e -> do + x' <- newUnique x + e' <- renameExp e + pure $ EAbsR x' x e' + +data R +type ExpRE = Exp R + +type instance XInt R = () +type instance XId R = Name +type instance XAdd R = () +type instance XApp R = () +type instance XAbs R = Unique +type instance XExp R = () + +pattern EIntR :: Integer -> ExpRE +pattern EIntR i = EInt () i + +pattern EIdR :: Name -> String -> ExpRE +pattern EIdR n s = EId n s + +pattern EAppR :: ExpRE -> ExpRE -> ExpRE +pattern EAppR e1 e2 = EApp () e1 e2 + +pattern EAbsR :: Unique -> String -> ExpRE -> ExpRE +pattern EAbsR u n e = EAbs u n e