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) ->  binop op (expr_int e1) (expr_int e2) 
|  _ -> 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 eval
    {global_vars = globs ;
    definitions = defs ;
    main = i} =
    instr i

Ce document a été traduit de LATEX par HEVEA.