ce/eval.ml

28 lines
655 B
OCaml

open Ast
exception Invalid_type
let arith intf a b =
match a, b with
| Int a, Int b -> Int (intf a b)
| _ -> raise Invalid_type
let binop_to_func = function
| Add -> arith Int.add
| Sub -> arith Int.sub
| Mul -> arith Int.mul
| Div -> arith Int.div
| Mod -> arith Int.rem
| _ -> assert false
let rec eval = function
| Value v -> v
| Binop (l, op, r) ->
let f = binop_to_func op in
f (eval l) (eval r)
| Set_binop_pre (op, l) ->
let l = match eval l with Int n -> n | _ -> raise Invalid_type in
Hashtbl.replace Parser.precedence op l;
Unit
| Get_binop_pre op ->
Int (Hashtbl.find Parser.precedence op)