open Pp exception PasEncore (* Pas encore fait *) type valeur = | Vint of int | Vbool of bool | Varray of valeur array | Undefined (* Pour les variables non initialisées *) type erreur = | DivZero | Type of type_expr * valeur | PasDef exception Erreur of erreur let erreur e = raise (Erreur e) (* Évaluation des primitives int * int -> valeur *) let binop op i1 i2 = match op with | Plus -> Vint (i1 + i2) | Minus -> Vint (i1 - i2) | Times -> Vint (i1 * i2) | Div -> if i2 = 0 then erreur DivZero else Vint (i1/i2) | _ -> raise PasEncore (* Évaluation des expressions, type Pp.expression -> valeur *) let rec expr e = match e with | Int i -> Vint i | Bin (op,e1, e2) -> (* Attention à l'ordre *) let i1 = expr_int e1 in let i2 = expr_int e2 in binop op i1 i2 | _ -> raise PasEncore (* Évaluation des expressions de type entier, type Pp.expression -> int *) and expr_int e = match expr e with | Vint i -> i | v -> erreur (Type (Integer, v)) let instr = function | Writeln_int e -> let i = expr_int e in print_int i ; print_newline () ; | _ -> raise PasEncore let instrs is = List.iter instr is let eval {global_vars = globs ; definitions = defs ; main = is} = instrs is |
Ce document a été traduit de LATEX par HEVEA.