next up previous contents
suivant: Paquets et règles monter: Structure des données précédent: Présentation de l'exemple   Table des matières

Déroulement de l'exemple

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
\includegraphics [scale=0.5]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema1.eps}

Terme() débute un nouveau terme (ici le premier) de la règle courante :

Figure: Exemple - étape 2
\includegraphics [scale=0.5]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema2.eps}

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
\includegraphics [scale=0.5]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema3.eps}

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
\includegraphics [scale=0.5]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema4.eps}

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
\includegraphics [scale=0.4]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema5.eps}

Fin_Foncteur() indique que le foncteur courant n'aura plus d'arguments et qu'il faut reprendre le chaînage des n\oe uds au niveau supérieur. Ce qui nous amène à la situation représentée en figure 1.6

Figure: Exemple - étape 6
\includegraphics [scale=0.4]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema6.eps}

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
\includegraphics [scale=0.4]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema7.eps}

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
\includegraphics [scale=0.5]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema8.eps}

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
\includegraphics [scale=0.5]{/home/alex/Cours1999-2000/Projet_Compil/Rapport/Schemas/schema9.eps}


next up previous contents
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