ministg-0.1: src/Ministg/Annotate.hs
-----------------------------------------------------------------------------
-- |
-- Module : Ministg.Annotate
-- Copyright : (c) 2009 Bernie Pope
-- License : BSD-style
-- Maintainer : bjpop@csse.unimelb.edu.au
-- Stability : experimental
-- Portability : ghc
--
-- Add stack annotations to top-level functions in ministg programs.
-----------------------------------------------------------------------------
module Ministg.Annotate where
import Ministg.AST
class Annotate t where
annotate :: t -> t
instance Annotate a => Annotate [a] where
annotate = map annotate
instance Annotate Program where
annotate (Program decls) = Program $ annotate decls
instance Annotate Decl where
-- don't annotate functions which are already annotated (by the user)
annotate decl@(Decl _ (Fun _ (Stack {}))) = decl
annotate (Decl var (Fun args body))
= Decl var (Fun args (Stack var body))
-- don't annotate thunks which are already annotated (by the user)
annotate decl@(Decl _ (Thunk (Stack {}) _)) = decl
annotate decl@(Decl var (Thunk body callStack))
= Decl var (Thunk (Stack var body) callStack)
annotate other = other