Extrait du cours initiation au Forth les structures de controles zForth
INTRODUCTION
Continuons notre étude du langage FORTH ! Avec ce 3ème volet, nous allons nous attaquer à un morceau de choix : les différentes structures de contrôles offertes dans la version de FORTH diffusée par le CNDP, pour les micro-ordinateurs fonctionnant sous le système d’exploitation EDEN (« CP/M like… « ). Nous nous bornerons aux structures de contrôles les plus utilisées (Il y en a plus d’une dizaine dans zFORTH… ). Nous examinerons, au travers d’une d’elles, les mécanismes internes mis en jeu. Mais de façon générale, on s’intéressera plutôt au protocole d’utilisation.
Il faut bien avoir à l’esprit qu’une structure de contrôle FORTH « typique » est composé d’un certain nombre de MOTS qui agissent au moment de la compilation: ce sont des mots dits immédiats. Le système FORTH (par le biais du mot INTERPRET) les exécutera, même en état compilation, ou lieu de compiler ainsi leur adresse-code (CFA) au sein de la définition dans laquelle ils sont invoqués.
1. LA STRUCTURE DE «IF-[ELSE]-END»
On peut exprimer son fonctionnement par :
– «si « condition remplie »
– alors faire un groupe d’instructions
– sinon en faire éventuellement un autre»
format : <flag déposé sur la piles IF
[instructions 1]
[ELSE
[instructions 2} ]
ENDIF
Définition des mots IF ELSE et ENDIF
:IF \ (f– ) à l’exécution et (– adr 2 ) lors de la compilation
COMPILE OBRANCH \ compile un pointeur sur OBRANCH dans la prochaine cellule libre
HERE \ empile l’adresse du sommet actuel du dictionnaire (– adr )
0 , \ compile un offset bidon dans la prochaine cellule
2 \ empile 2, marqueur de cette structure de contrôle (– adr 2 ) ; IMMEDIATE \ fin de la définition, celle-ci étant Immédiate
ELSE \ ( adr1 2 — adr2 2 ) lors de la compilation exclusivement
2 ?PAIRS \ teste l’égalité à 2 (y a bien eu IF avant…?), si * de 2 -> mess.
d’erreur !
COMPILE BRANCH \ compile un pointeur sur BRANCH dans la prochaine cellule
libre
HERE \ empile l’adresse du sommet actuel du dictionnaire ( adr 1- adr 1 adr2)
0 , \ compile un offset bidon dans la prochaine cellule SWAP \ ( adr 1 – adr 1 adr2) devient ( adr 1 — adr2 adr 1 )
2 \ empile 2 ( adr2 adr 1 – adr2 adr 1 2 )
[COMPILE] ENDIF \ utilise ENDIF pour résoudre le branchement conditionnel en adr 1
Exemple de définition utilisant « IF…ELSE…ENDIF »
: touche
KEY DUP
« A « Z2 [WITHIN] OVER « a « z [WITHIN] OR
CA SWAP EMIT
IF
. » est une lettre »
ELSE
. »n’est pas une lettre »
ENDIF ;’
2. LA STRUCTURE DE CONTRÔLE «BEGIN…UNTIL»
On peut exprimer son fonctionnement par :
«répéter {instructions} jusqu’à ce qu’une condition soit vraie» format : BEGIN {In s truc tions] [flag déposé sur la pile) UNTIL Les instructions situées dans la corps de la boucle doivent laisser un flag sur la pile. UNTIL absorbe alors ce flag, et reboucle si la condition n’est pas vraie (c’est-à-dire si le flag est faux).
Exemple d’utilisation. Soit l’algorithme suivant :
«Jusqu’à ce que l’on appuie sur {RETURN} répéter
║lire une touche, et afficher le caractère correspondant.»
La programmation pourrait être la suivante :
3. LA STRUCTURE DE CONTRÔLE «BEGIN…WHILE …REPEAT»
On peut exprimer son fonctionnement par :
«répéter {instructions} tant qu’une condition est vraie»
format : BEGIN
{instructions I}
[flag déposé sur la pile]
WHILE
{instructions 2}
REPEAT
Le groupe d’instructions 1 laissent un flag sur la pile: si celui-ci est faux (f=0), une sortie de la boucle est alors effectuée (branchement après
REPEAT), sinon le groupe d’instructions 2 est exécuté, puis un branchement sur le début de boucle (juste après BEGIN) est alors effectué.
Exemple d’utilisation. Soit l’algorithme suivant:
«Tant que non-appui sur la toucha {RETURN} répéter
║lire une touche, et afficherle caractère correspondant.»
La programmation pourrait être la suivante :
ECH02
BEGIN \ début de la boucle indéfinie
KEY DUP \ lire une touche et dupliquer son code ASCII
^M < > \ empiler un flag indiquant si appui sur (RETURN)
1WHILE \ sortie de boucle si ce flag est faux (f=0 )
EMIT \ afficher le caractère correspondant
REPERT \ fin de la boucle ==> on revient au début de la boucle
DROP ; \ «dropper» la valeur 13, code ASCII de (RETURN)
……..
Cours initiation au Forth les structures de controles zForth (820 KO) (Cours PDF)