type instr_asm= CONST of int|ADD|SUB|MUL|DIV|EQU|NEQ |ALLOC of int|FREE of int |LOAD of int|STORE of int|PUSH |JNZ|JMP of int |CALL of int|RET |STOP;; let pc=ref(0);; let sp=ref(0);; let bp=ref(0);; type 'a pile = {mutable indice : int ; mutable contenu : 'a array};; exception Pilevide;; exception ImpossibleADD;; exception ImpossibleSUB;; exception ImpossibleMUL;; exception ImpossibleDIV;; exception ImpossibleEQU;; exception ImpossibleNEQ;; let create () = {indice = 0;contenu = [||]};; let pile_A = create ();; let pile_ap= create ();; let empiler x p = if p.indice == Array.length p.contenu then p.contenu <- Array.append p.contenu(Array.create 5 0); p.contenu.(p.indice) <- x; p.indice <- (p.indice +1);; let depiler p = if p.indice=0 then raise Pilevide else p.indice <- ((p.indice)-1); p.contenu.(p.indice) <- 0;; let construction l = match l with CONST n -> empiler n pile_A; | ADD -> if pile_A.indice =0 then raise Pilevide else if pile_A.indice =1 then raise ImpossibleADD else pile_A.contenu.((pile_A.indice)-2) <- pile_A.contenu.((pile_A.indice)-2) + pile_A.contenu.((pile_A.indice)-1); depiler pile_A; | SUB -> if pile_A.indice =0 then raise Pilevide else if pile_A.indice =1 then raise ImpossibleSUB else pile_A.contenu.((pile_A.indice)-2) <- pile_A.contenu.((pile_A.indice)-2) - pile_A.contenu.((pile_A.indice)-1); depiler pile_A; | MUL -> if pile_A.indice =0 then raise Pilevide else if pile_A.indice =1 then raise ImpossibleMUL else pile_A.contenu.((pile_A.indice)-2) <- pile_A.contenu.((pile_A.indice)-2) * pile_A.contenu.((pile_A.indice)-1); depiler pile_A; | DIV -> if pile_A.indice =0 then raise Pilevide else if pile_A.indice =1 then raise ImpossibleDIV else pile_A.contenu.((pile_A.indice)-2) <- pile_A.contenu.((pile_A.indice)-2) / pile_A.contenu.((pile_A.indice)-1); depiler pile_A; | EQU -> if pile_A.indice =0 then raise Pilevide else if pile_A.indice =1 then raise ImpossibleEQU else if (pile_A.contenu.((pile_A.indice)-2) == pile_A.contenu.((pile_A.indice)-1)) then (depiler pile_A; depiler pile_A ; empiler 1 pile_A) else (depiler pile_A ; depiler pile_A ; empiler 0 pile_A); | NEQ -> if (pile_A.indice =0) then raise Pilevide else if (pile_A.indice =1) then raise ImpossibleNEQ else if (pile_A.contenu.((pile_A.indice)-2) <> pile_A.contenu.((pile_A.indice)-1)) then (depiler pile_A;depiler pile_A; empiler 1 pile_A) else (depiler pile_A; depiler pile_A; empiler 0 pile_A); |ALLOC n -> pile_ap.contenu<- Array.create n 0; pc:=!pc+1; sp:=!sp+n; |FREE n-> pile_A.contenu<-Array.sub pile_A.contenu 0 3;;