alpha-0.9999: src/Translate.hs
module Translate where
import My.Control.Monad
import Data.Bimap as BM
import ID
import PCode
import Context.Types as C
class Translatable t where
translate :: (ID -> ID) -> t -> t
instance Translatable ID where
translate = ($)
instance Translatable a => Translatable (Range a) where
translate t (Range (a,b)) = Range (translate t a,translate t b)
instance Translatable e => Translatable [e] where
translate tr l = map (translate tr) l
instance Translatable C.Value where
translate tr (Verb code) = Verb (translate tr code)
translate tr (Noun size init) = Noun (translate tr size) (translate tr init)
translate tr x = x
instance Translatable Instruction where
translate tr (Op b v vs) = Op b (translate tr v) (translate tr vs)
translate tr (Branch v as) = Branch (translate tr v) as
translate tr (Bind bv v) = Bind (translate tr bv) (fmap (translate tr) v)
translate tr Noop = Noop
instance Translatable PCode.Value where
translate tr (SymVal t id) = SymVal t (translate tr id)
translate tr v = v
instance Translatable Code where
translate tr (Code args code ret) = Code (translate tr args) (translate tr code) (fmap (translate tr) ret)
instance Translatable BindVar where
translate tr (BindVar id s pad subs) = BindVar (translate tr id) s pad [(translate tr bv,s) | (bv,s) <- subs]