Objectifs
Créer un langage de programmation de zéro est un excercice particulièrement intéressant à bien des égards.
D'abord parce que c'est réputé difficile. Je m'explique: autant il est relativement aisé de coder un petit analyseur syntaxique (les termes techniques seront expliqués plus tard) pour des langages 'jouets' extrêmement simples, c'est une toute autre affaire dés lors que le projet devient plus ambitieux, avec un langage plus complexe déstiné à un usage réel. Il faut traiter toute erreur possible et indiquer où elle se trouve avec une information utile. Il faut pouvoir tracer le programme (l'exécuter pas-à-pas) et pouvoir inspecter les variables, une éventuelle pile, les paramètres de fonctions, variables locales, etc... Un programme qui ferait une opération illicite ne doit pas faire planter l'environement de programmation, même en cas de dépassement de la capacité mémoire. Un programme qui tournerait en rond dans une boucle infinie (par exemple) doit pouvoir être stoppé ou bien mis en pause afin de pouvoir en déterminer la cause. Et j'en passe... Bref, c'est beaucoup plus compliqué que de coder un petit tutoriel pour analyser du JSON...
Ensuite, parce que, pour être fait correctement, sans faire une usine à gaz, il faut connaître un minimum la théorie (sans cela, c'est quasiment voué à l'echec) et parvenir à la mettre en oeuvre de manière efficace, le plus simplement possible. En effet, si après avoir lu un bon livre de théorie des langages vous programmez naïvement les algorithmes proposés en utilisant les structures de la librairie standard, vous obtiendrez au mieux un programme qui va ramer et sera difficile à maintenir et à debugger et, au pire, un programme qui plantera et dans lequel vous n'aurez aucune chance de savoir pourquoi (et je le sais d'autant mieux que cela m'est arrivé...). Typiquement, si vous partez sur une grammaire complexe pour laquelle vous souhaitez implémenter un analyseur LALR(1) (comme YACC ou Bison), ça va être très compliqué. Ces méthodes et ces logiciels sont destinés à des programmeurs aggueris qui savent parfaitement comment ça fonctionne et qui, le cas échéant, seraient capables de coder un analyseur sans ces outils.
Enfin parce que ça permet de se confronter à quasiment toutes les problématiques classiques de programmation et donc que c'est l'occasion de proposer énormément d'astuces et de conseils concrets. Et, comme ce langage sera codé 'à la main' de manière (je l'espère) trés simple, ça permettra à ceux qui le souhaitent de l'adapter et de le modifier à leur guise pour se faire leur langage. J'ajoute que personnellement c'est aussi particulièrement gratifiant de coder un langage pour un programmeur.
Concrètement
Ce chapitre sur la création d'un langage ressemblera un peu à un tutoriel. Dans un premier temps nous poserons les bases en codant un analyseur d'expression mathématique simple. Seules les quatres opérations élémentaires ainsi que les parenthèses seront pris en compte. Les nombres acceptés seront les entiers et les nombres à virgule flottante (double en C/C++).
Nous allons voir que déja quelques pièges vont se présenter et que pour être fait correctement, cela nécessitera un peu de code. Je rappelle que le but n'est pas de coder l'analyseur d'expression mathématique le plus simple et le plus concis. Ceci n'est que la première étape pour obtenir un analyseur bien plus complexe.