Dans le précédent article, notre héros, le Lisp, a fait l’objet d’un rappel de ses innombrables qualités. Inspirés par ce modèle, nous avons présenté rapidement le caractère modulaire que nous souhaitions donner à notre langage, puis décrit la structure de données contenant le code parsé, et enfin écrit un parseur récursif descendant. Tout ça n’est pas très utile. Nous allons remédier à ça en ajoutant un interpréteur à notre langage.
Dans ce second article, nous allons donner vie à notre langage en lui offrant un interpréteur, et un premier ensemble de fonctions arithmétiques, tout en revenant en détail sur la gestion de nos modules.
A l’issue de notre premier article, nous avions réussi à mettre au point un premier code nous permettant de transformer une chaîne de caractères en une représentation syntaxique de notre langage.
Très simplement, avec ce premier outil, nous sommes en mesure de transformer (+ 1 2 (* 3 5)) en un vecteur C++ de Sexpexpr contenant :
expr[0] // SymbolAtom +
expr[1] // RealAtom 1.0
expr[2] // RealAtom 2.0
expr[3] // Sexp contenant : SymbolAtom *, RealAtom 3, RealAtom 4
Ce que nous aimerions faire à présent, c’est parcourir cette expression expr pour l’exécuter et obtenir le résultat suivant :
15 ;;; =(+ 1 2 (* 3 4))
C’est ce que va faire notre interpréteur.
1. Tout est dans l’interprétation
Si...
- Accédez à tous les contenus de Connect en illimité
- Découvrez des listes de lecture et des contenus Premium
- Consultez les nouveaux articles en avant-première