Fichier interpret1.ml.
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,e1e2) ->
  (* 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 (Integerv))

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.