37 lines
749 B
Haskell
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
|