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]