playground/haskell/Imp/Stmt.hs

37 lines
749 B
Haskell

module Expr where
import Control.Applicative -- for `Alternative' typeclass
import qualified AExpr as AE
import qualified BExpr as BE
import qualified Dict
import qualified Parser as P
data Stmt
= Skip -- for empty 'if' and 'while' body
| Assign String AE.E
| Seq Stmt Stmt
| If BE.E Stmt Stmt
| While BE.E Stmt
parser :: P.Parser Stmt
type Env = [(String, Int)]
eval :: Env -> Stmt -> Env
eval env st = case st of
Skip -> env
Assign var e ->
Dict.set env var (AE.eval e)
Seq s1 s2 ->
let env' = eval env s1 in
eval env' s2
If b s1 s2 ->
if BE.eval b then eval env s1
else eval env s2
While b st ->
if BE.eval b then
let env' = eval env st in
eval env' (While b st)
else env