suivant: Paquets et règles
monter: Structure des données
précédent: Présentation de l'exemple
  Table des matières
Le point de génération Debut_Session() se contente d'initialiser tous les pointeurs à
NULL.
Pour sa part, Regle() prépare la prise en compte d'un nouvelle règle (ici la première), en chaînant
un nouvel objet de type regle_typ :
Figure:
Exemple - étape 1
|
|
Terme() débute un nouveau terme (ici le premier) de la règle courante :
Figure:
Exemple - étape 2
|
|
Symbole("conc") a pour effet d'ajouter conc dans la table des symboles. Celui-ci étant un
foncteur, Foncteur empile un objet dans la pile de reprise.
Figure:
Exemple - étape 3
|
|
Dans la figure 1.3 Terme() ne débute pas un nouveau terme, étant donné que l'on est imbriqué dans au moins
(ici exactement) un niveau de foncteurs. Il peut sembler étrange de passer par ce point de génération
alors que la connaissance de Prolog nous indique que l'on reste dans le même terme. En fait, le
symbole suites_de_termes est utilisé à deux endroits : pour les différents termes d'une règle et
aussi pour les arguments des foncteurs. Cela permet de simplifier la grammaire, mais les traitements
ne sont pas les mêmes dans les deux cas. En outre, la conséquence de cet amalgame est qu'il faut
séparer par des virgules les différents termes d'une règle, tout comme les arguments d'un foncteur
le sont. En tout cas, après Symbole("k") ; Foncteur() ; on en arrive au résultat représenté
en figure 1.4
Figure:
Exemple - étape 4
|
|
De la même façon que précédemment, Terme() ; Symbole("a") ; Variable() ; puis
Terme() ; Symbole("b") ; Variable() ; créent les structures correspondant aux arguments de k.
On notera que noeud pointe alors sur le champ suivant du dernier argument, au cas où il y en
aurait d'autres, comme nous l'indique la figure 1.5
Figure:
Exemple - étape 5
|
|
Fin_Foncteur() indique que le foncteur courant n'aura plus d'arguments et qu'il faut reprendre
le chaînage des n
uds au niveau supérieur. Ce qui nous amène à la situation représentée en
figure 1.6
Figure:
Exemple - étape 6
|
|
Les deux derniers arguments de conc, à savoir *c et k(*a, *d) sont alors
pris en compte comme l'indique la figure 1.7
Figure:
Exemple - étape 7
|
|
Fin_Foncteur() termine alors les arguments du foncteur conc. Paquet() n'a ici aucun
effet ; le rôle de ce point de génération sera étudié plus loin. La situation est alors celle décrite
à la figure 1.8
Figure:
Exemple - étape 8
|
|
La partie droite de la règle est alors traitée. Les termes correspondants (uniques ici) sont chaînés
directement au terme en partie gauche. La flèche n'est absolument pas mémorisée : il y a toujours
une flèche après le premier terme d'une règle. Fin_Regle() signale alors la fin de la règle mais ne
fait rien (ce point de génération est uniquement utilisé pour tracé l'exécution du compilateur en
phase de débuggage). On se trouve alors dans la situation de la figure 1.9
Figure:
Exemple - étape 9
|
|
suivant: Paquets et règles
monter: Structure des données
précédent: Présentation de l'exemple
  Table des matières
Alexandre DAGAN
2000-07-07