zo iNiTiATiON SPEECHES
S01E24 2024-08-21

S01E24 — 21-08-2024.

J’suis dans le starting bloque.

jour 24.

J’entrevois le bout du tunnel avec ce moule à gauffre de Tokenizer. Il n’est pas encore stable du tout : Par exemple pour qu’il fasse son job à plein temps je dois formatter mes entrées de la façon suivante : fun main () {} au lieu de fun main() {}. Lorsque la parenthèse est collé au nom de la fonction, la machine à états finis mange des caractères. Un comportement pour l’instant normal au vu de mon implémentation. Ce qu’il se passe c’est que lorsque le Tokenizer rentre dans l’état réservé aux identifiants, il n’a pas la possibilité de reconsommeer le caractère sortant. Ce caractère passe à la trape de l’analyse :

    foo()
//  ^^^^^
//  12345

Pour analyser foo(), le Tokenizer à un état initial qui est TokenizerState::Program. Celui-ci va récupérer le caractère entrant pour détecter quel sera son état d’analyse pour le caractère courant.

1 — Le tokenizer a détecté que f est un caractère alphabétique, son état devient TokenizerState::Ident et il ajoute le f dans un buffer.
2 et 3 — Une fois dans cet état, tant que les caractères sont valides, il va les ajouter dans le buffer.
4 — C’est le caractère invalide à l’état TokenizerState qui permet au tokenizer de basculer vers le prochain état TokenizerState::Group.
5 — Au lieu de prendre en compte le caractère 4, il va le manger pour ne prendre en compte le caractère 5.

Tout de suite, tu comprends que j’ai un tour de boucle de retard entre chaque transition. C’est là que je bloque, parce qu’au caractère (, je crée le jeton Ident("foo") donc je n’ai pas la possibilité de renvoyer l’identifier et la parenthèse ouverte en même temps.

Deux solutions que j’ai en tête, c’est :

  • Avoir la possibilité de reconsommer le caractère en cours. De cette manière, j’évite d’avoir un tour de boucle de retard.
  • Avoir en mémoire un buffer pour les jetons. Je pourrai ainsi ajouter les jetons directement dans le buffer. Mais je ne suis pas sûr de cette option. Je pense que je vais tomber sur la même problématique.

Pas évident mon commandant… Je vais continuer de rajouter des rustines sur mon Tokenizer jusqu’à revenir à un comportement similaire à ce que j’avais avec la première version du Tokenizer. Si je suis vraiment bloqué, je vais mettre mon idée de côté et je verrai plus tard.

Mais ce qui est bien avec la nouvelle implémentation c’est que je peux scanner des symboles propres à au langage de programmation ainsi que ceux propres au langage de balisage. Cela fonctionne ultra bienn, merci à Keegan McAllister alias @kmcallister. Je t’avais parlé de cette personne implicitement en parlant de la caisse html5ever ici. C’est Keegan qui a créé les fondamentaux du projet — vraiment la base du projet repose sur son cerveau. Je vais réserver un petit paragraphe dans un pour speech donner plus de détail. J’essaye de rentrer dans son cerveau pour comprendre son implémentation. Je me dit que ça pourrait t’aider aussi si tu souhaites comprendre comment créer une machine à états finis bien huilée.

@invisageable