S01E11 — 08-08-2024.
Une refonte du code s’impose.
jour 11.
Avant de voir, pourquoi je vais devoir réécrire certaines parties du code. Parlons des nouvelles implémentations.
Je voulais que mon langage est la notion de tuple :
(int, float)— le type d’un tuple qui contient deux élements de typeintetfloat.(42, 1.0)— la déclaration d’un tuple avec les valeurs correspondantes.
Rien de bien méchant en soit. Mais je ne savais pas comment l’intégrer côté parser. J’utilise déjà les parenthèses en tant que délimiteur en tant que groupe 2 + (2 * 42). Dans cet exemple, les parenthèses vont grouper des expressions pour s’assurer de l’ordre d’exécution des opérations binaires. Alors, comment faire comprendre à mon compilateur qu’un tuple n’est pas un groupe ?
Finalement, je suis parti sur un petit hack pour ne pas trop a voir a casser tout le code. Dorévanant, lorsque le curseur scanne une parentthèse. Il va avoir deux choix. après avoir avancer sur le jeton qui suit — si le jeton suivant est une , alors il doit traiter l’expression en cours comme un tuple. Si non, il le traite comme un groupe d’expression.
2 + (2 * 42)
^
curseur
Le traitement commence ici, dans ce cas, si il avance sur le 2 pour ensuite scanner le jeton suivant. Il ne trouvera pas de ,. Il va donc créer traiter l’expression comme un groupe.
(2, 1.0)
^
curseur
Ici, il va au contraire traiter cette expression comme un tuple. Puisque le jeton après le 2 est une ,. Et retournera un tuple. C’est vraiment pas mal. A voir comment si ça tient la route.
Il doit y avoir des meilleurs solutions mais dans mon cas ça fonctionne sans nécessité beaucoup de boulot. Habituellement je n’aime pas avoir des fonctions du type parse_group_or_tuple mais il y a toujours des exceptions. Puis, je me rends compte que selon la syntaxe du langage, on a pas le choix. Voilà pourquoi faut bien penser sa syntaxe en amont pour s’assurer qu’elle sera facile à analyser.
Pour en revenir, au titre du jour. Je vais passer les prochains jours à réécrire le parser. J’ai certaines expressions qui ne fonctionne plus, je ne sais pas si c’est depuis l’ajout de nouvelles features ou dû à une petite réécriture d’une fonction que j’ai fais dans le train. Aussi, il faut que je pense à écrire des tests comme ça, je pourrai me rends compte plus rapidement si j’ai cassé un truc.
Une fois que j’aurai réparé mes bavures, je te parlerai des nouvelles expressions que j’ai intégré hier.