Semaine 6 – Interprète d’un mini-langage (1)

source et licence inconnue ! // tumblr vie lente
, par
Semaine 6. Évaluation d’expressions arithmétiques simples sur les entiers et ajout des variables impératives. Quelques explications sur le projet, à suivre dans un autre document (importation d’images png, transformations affines en coordonnées homogènes, plateau de jeu, objets mobiles).
- (* évaluation d'expressions à valeur entières *)
- | Plus of expression * expression
- | Mult of expression * expression
- | Div of expression * expression
- | Moins of expression * expression
- | Opp of expression
- | Egal of expression * expression
- | Sup of expression * expression
- | Inf of expression * expression
- ;;
- let rec eval = function
- | Ent n -> n
- | Plus (e1, e2) -> (eval e1) + (eval e2)
- | Mult (e1, e2) -> (eval e1) * (eval e2)
- | Div (e1, e2) -> (eval e1) / (eval e2)
- | Moins (e1, e2) -> (eval e1) - (eval e2)
- | Opp e1 -> (-1) * (eval e1)
- | Egal (e1, e2) -> (match (eval e1) = (eval e2) with true -> 1
- | false -> 0)
- | Sup (e1, e2) -> (match (eval e1) > (eval e2) with true -> 1
- | false -> 0)
- | Inf (e1, e2) -> (match (eval e1) < (eval e2) with true -> 1
- | false -> 0)
- ;;
- "(23 < ((10 / 3) + (8 * 2)))";;
- let e = Inf (
- Ent 23,
- Plus (
- Div (Ent 10, Ent 3), (* x en 0 *)
- Mult (Ent 8, Ent 2)
- )
- );;
- eval e;;
- (* ajoutons des variables impératives *)
- let etats = [|0; 0; 0; 0;|];; (* la mémoire *)
- exception Segfault;;
- | Plus of expression * expression
- | Mult of expression * expression
- | Div of expression * expression
- | Moins of expression * expression
- | Opp of expression
- | Egal of expression * expression
- | Sup of expression * expression
- | Inf of expression * expression
- (* adresse mémoire *)
- ;;
- let rec eval = function
- | Ent n -> n
- | Plus (e1, e2) -> (eval e1) + (eval e2)
- | Mult (e1, e2) -> (eval e1) * (eval e2)
- | Div (e1, e2) -> (eval e1) / (eval e2)
- | Moins (e1, e2) -> (eval e1) - (eval e2)
- | Opp e1 -> (-1) * (eval e1)
- | Egal (e1, e2) -> (match (eval e1) = (eval e2) with true -> 1
- | false -> 0)
- | Sup (e1, e2) -> (match (eval e1) > (eval e2) with true -> 1
- | false -> 0)
- | Inf (e1, e2) -> (match (eval e1) < (eval e2) with true -> 1
- | false -> 0)
- | Var n when n < 4 && n >= 0 -> etats.(n)
- | Var n -> raise Segfault
- ;;
- "(23 > ((x / 3) + (8 * 2)))";;
- let e = Sup (
- Ent 23,
- Plus (
- Div (Var 0, Ent 3), (* x en 0 *)
- Mult (Ent 8, Ent 2)
- )
- );;
- eval e;;
- (* maintenant on veut ajouter les instructions affectation, et *)
- (* séquence (bloc) d'instructions. Comment faire ? (à suivre au TP 7) *)