1 module StackMap where 2 3 import Syntax 4 import Data.List( union ) 5 6 type StackMap = (Int,[Name]) 7 8 stackMap :: Command -> StackMap 9 stackMap c = (0, comVars c) 10 11 push :: StackMap -> StackMap 12 push (n, vars) = (n+1, vars) 13 14 pop :: StackMap -> StackMap 15 pop (n, vars) = (n-1, vars) 16 17 location :: StackMap -> Name -> Int 18 location (n, vars) v = n + length (takeWhile (/=v) vars) 19 20 depth :: StackMap -> Int 21 depth (n, vars) = n + length vars 22 23 expVars :: Expr -> [Name] 24 expVars (Var v) = [v] 25 expVars (Val _) = [] 26 expVars (Uno _ a) = expVars a 27 expVars (Duo _ a b) = expVars a `union` expVars b 28 29 comVars :: Command -> [Name] 30 comVars Skip = [] 31 comVars (x := e) = [x] `union` expVars e 32 comVars (c1 :-> c2) = comVars c1 `union` comVars c2 33 comVars (If e c1 c2) = expVars e `union` comVars c1 `union` comVars c2 34 comVars (While e c) = expVars e `union` comVars c 35 comVars (Print e) = expVars e