26 mai 2026
Pour ajouter repete, il faut intervenir surtout dans la
compilation des instructions, puis ajouter une instruction capable de
boucler.
Le lexer est presque prêt : dans Lexer.h, kwRepeat = "repete"
existe déjà, et Lexer.cpp reconnaît
déjà [ et ] comme signes. Donc le texte
repete 6 [ avance 40 droite 60 ] est déjà découpé
correctement.
Les étapes :
Créer une classe Repeat Elle hériterait de
Instruction, comme Move, Turn ou
FunctionCall.
Elle doit stocker :
6[ et ],
probablement sous forme d’un ProgramModifier Program::parseKeyword Ajouter un cas :
} else if (token->second == kwRepeat) {
myInstructions.push_back(std::make_unique<Repeat>(tokens, ++token, mainProgram));
}Le constructeur de Repeat devra ensuite :
repete[]] est présentAdapter le parsing des blocs Aujourd’hui, Program
s’arrête surtout quand il rencontre fin, utilisé pour les
fonctions pour ... fin.
Pour repete, il faut aussi pouvoir parser un bloc qui
s’arrête sur ].
Deux approches possibles :
Program pour accepter un “délimiteur de fin”
configurable : fin pour une fonction, ] pour
un repeat ;Repeat une logique spécifique qui lit
les tokens jusqu’au crochet fermant.La première approche est plus propre.
Gérer l’exécution de la boucle Le plus cohérent avec l’architecture actuelle est de traiter le bloc répété comme un petit sous-programme.
Quand Repeat::doExecute() est appelée :
ExecutionContext vers le début
du bloc répété.Quand le bloc se termine,
Repeat::doGetNext(..., BackFromSubroutine) décide :
Stocker le compteur au bon endroit Attention : l’objet
Repeat ne devrait idéalement pas stocker directement l’état
courant de la boucle, car la même instruction peut être réutilisée lors
d’appels de fonctions.
Le mieux est de stocker le compteur dans
ExecutionContext, qui représente justement l’état
d’exécution courant. Il contient déjà une map myVariables,
mais elle est peu utilisée. Tu peux l’étendre pour gérer des compteurs
internes de boucle.
Ajouter Repeat.cpp / Repeat.h dans le
CMake Une fois la classe créée, il faut l’ajouter dans src/main/CMakeLists.txt, comme les
autres fichiers.
Tester avec prog2.logo Le programme contient :
pour hex
repete 6 [avance 40 droite 60]
fin
Le résultat attendu est que repete 6 [...] exécute six
fois le bloc avance 40 droite 60, donc dessine un
hexagone.
Le gros point de conception est donc celui-ci : repete
n’est pas une commande simple comme avance; c’est une
instruction de contrôle qui contient elle-même un bloc d’instructions.
C’est pour ça qu’elle touche à la fois au parsing et à la pile
d’exécution.