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

source et licence inconnue ! // tumblr vie lente

, par Pierre

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).

  1. (* évaluation d'expressions à valeur entières *)
  2. type expression = Ent of int
  3.                 | Plus of expression * expression
  4.                 | Mult of expression * expression
  5.                 | Div of expression * expression
  6.                 | Moins of expression * expression
  7.                 | Opp of expression
  8.                 | Egal of expression * expression
  9.                 | Sup of expression * expression
  10.                 | Inf of expression * expression
  11. ;;
  12.  
  13. let rec eval = function
  14.   | Ent n -> n
  15.   | Plus (e1, e2) -> (eval e1) + (eval e2)
  16.   | Mult (e1, e2) -> (eval e1) * (eval e2)
  17.   | Div (e1, e2) -> (eval e1) / (eval e2)
  18.   | Moins (e1, e2) -> (eval e1) - (eval e2)
  19.   | Opp e1 -> (-1) * (eval e1)
  20.   | Egal (e1, e2) -> (match (eval e1) = (eval e2) with true -> 1
  21.                                                     | false -> 0)
  22.   | Sup (e1, e2)  -> (match (eval e1) > (eval e2) with true -> 1
  23.                                                     | false -> 0)
  24.   | Inf (e1, e2)  -> (match (eval e1) < (eval e2) with true -> 1
  25.                                                     | false -> 0)
  26. ;;
  27.  
  28. "(23 < ((10 / 3) + (8 * 2)))";;
  29. let e = Inf (
  30.             Ent 23,
  31.             Plus (
  32.                  Div (Ent 10, Ent 3), (* x en 0 *)
  33.                  Mult (Ent 8, Ent 2)
  34.               )
  35.           );;
  36. eval e;;
  37.  
  38. (* ajoutons des variables impératives *)
  39. let etats = [|0; 0; 0; 0;|];; (* la mémoire *)
  40.  
  41. exception Segfault;;
  42.  
  43. type expression = Ent of int
  44.                 | Plus of expression * expression
  45.                 | Mult of expression * expression
  46.                 | Div of expression * expression
  47.                 | Moins of expression * expression
  48.                 | Opp of expression
  49.                 | Egal of expression * expression
  50.                 | Sup of expression * expression
  51.                 | Inf of expression * expression
  52.                 | Var of int (* une variable impérative est une *)
  53.                              (* adresse mémoire *)
  54. ;;
  55.  
  56. let rec eval = function
  57.   | Ent n -> n
  58.   | Plus (e1, e2) -> (eval e1) + (eval e2)
  59.   | Mult (e1, e2) -> (eval e1) * (eval e2)
  60.   | Div (e1, e2) -> (eval e1) / (eval e2)
  61.   | Moins (e1, e2) -> (eval e1) - (eval e2)
  62.   | Opp e1 -> (-1) * (eval e1)
  63.   | Egal (e1, e2) -> (match (eval e1) = (eval e2) with true -> 1
  64.                                                     | false -> 0)
  65.   | Sup (e1, e2)  -> (match (eval e1) > (eval e2) with true -> 1
  66.                                                     | false -> 0)
  67.   | Inf (e1, e2)  -> (match (eval e1) < (eval e2) with true -> 1
  68.                                                     | false -> 0)
  69.   | Var n when n < 4 &amp;&amp; n >= 0 -> etats.(n)
  70.   | Var n -> raise Segfault
  71. ;;
  72.  
  73. "(23 > ((x / 3) + (8 * 2)))";;
  74. let e = Sup (
  75.             Ent 23,
  76.             Plus (
  77.                  Div (Var 0, Ent 3), (* x en 0 *)
  78.                  Mult (Ent 8, Ent 2)
  79.               )
  80.           );;
  81. eval e;;
  82.  
  83. (* maintenant on veut ajouter les instructions affectation, et *)
  84. (* séquence (bloc) d'instructions. Comment faire ? (à suivre au TP 7) *)

Télécharger

Revenu et logement, Je livre ici quelques éléments de comparaison concernant mon niveau de vie, pour couper court à quelques idées reçues, et un condensé de nombreuses (...)
Revenu et travail d’un enseignant-chercheur, Cet article complète l'article Revenu et logement, en détaillant un peu le budget de mon ménage, mon parcours d'enseignant-chercheur en terme de (...)
Cybersyn (el systemo synco), Au café, mardi 5 avril 2011, j'ai bien vu que, mis à part Antoine Allombert, personne ne connaissait l'histoire de l'extraordinaire projet chilien (...) [jpg, jpg, png]