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