Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type PrimValue =
- | BoolVal of bool
- | IntVal of int
- let inline operator val1 val2 op = op val1 val2
- let rec eval (expr : expr) =
- match expr with
- | CstI i -> IntVal i
- | Prim ("+", lOper, rOper) -> evalNumericExpr (+) lOper rOper
- | Prim ("-", lOper, rOper) -> evalNumericExpr (-) lOper rOper
- | Prim ("*", lOper, rOper) -> evalNumericExpr (*) lOper rOper
- | Prim ("/", lOper, rOper) -> evalNumericExpr (/) lOper rOper
- | Prim ("%", lOper, rOper) -> evalNumericExpr (%) lOper rOper
- | CstB b -> BoolVal b
- | Prim ("=", lOper, rOper)-> evalBoolExpr (=) lOper rOper
- | Prim ("<>",lOper, rOper)-> evalBoolExpr (<>) lOper rOper
- | Prim (">", lOper, rOper)-> evalBoolExpr (>) lOper rOper
- | Prim ("<", lOper, rOper)-> evalBoolExpr (<) lOper rOper
- | Prim (">=", lOper, rOper)-> evalBoolExpr (>=) lOper rOper
- | Prim ("<=", lOper, rOper)-> evalBoolExpr (<=) lOper rOper
- | _ -> failwith "Syntax error"
- and evalNumericExpr op lOper rOper =
- let left = eval lOper
- let right = eval rOper
- match (left, right) with
- | (IntVal a, IntVal b) -> IntVal (op a b)
- | _ -> failwith "Syntax error"
- and evalBoolExpr op lOper rOper =
- let left = eval lOper
- let right = eval rOper
- match (left, right) with
- | (BoolVal a, BoolVal b) -> BoolVal (op a b)
- | (IntVal a, IntVal b) -> BoolVal (op a b)
- | _ -> failwith "Syntax error"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement