• Aucun résultat trouvé

Chapitre 6. Intégration du flot de données: Implémentation

6.4 Le générateur automatique

6.4.2 Les structures de données

Pour le générateur automatique de code, il faut penser à deux groupes séparés de structures de données. Le premier groupe concerne les structures de données utilisés lors de la génération de code tandis que le second groupe est pour les structures de données requises pour les codes générés.

6.4.2.1 Les structures de données pour le générateur de code

Avant de créer les fichiers produits par le générateur, le contenu de chaque fichier est mis dans une structure de données formée de ligne chaînées. Cette structure est aussi utilisée par l'éditeur de texte et offre des primitives de manipulation (insertion, copie, concaténation, …).

type ChainedString is record

NbLines : INTEGER := 0; FirstPtr : LinePtr := null; LastPtr : LinePtr := null; CurrentLineNb : INTEGER := 0; CurrentPtr : LinePtr := null; end record;

Chaque instruction simple est mise dans une structure qui offre aussi en même temps des informations pour son écriture.

TYPE TypeInstruction IS RECORD CodeInstruction:csLine; PointVirgule,DoitIndenter,New_Line:BOOLEAN:=TRUE; Indentation:INTEGER:=0; END RECORD;

Le champs CodeInstruction contient le texte de l'instruction. Si PointVirgule est vrai l'instruction sera suivie d'un point virgule. Si DoitIndenter est vrai l'instruction sera indentée à la position courante. Si New_Line est vrai l'instruction suivante sera sur une nouvelle ligne. Le champ Indentation indique si les instructions qui suivent doivent être indentées par rapport a celle-ci et dans quel sens se fait l'indentation (Nombre de caractères dans un sens ou dans l'autre en fonction du signe).

160 Chapitre 6 Intégration du flot de données: Implémentation

Il est parfois aussi nécessaire de passer aux procédures servant à écrire le code plusieurs éléments qui forment un tout dans le langage cible. Pour cela deux listes munies de primitives de manipulation sont créées, la première pour la liste d'instruction et la seconde pour la liste de variable. Pour cette dernière, le type TypeVariable indique s'il s'agit d'un paramètre passé par référence ou par valeur, ou d'une variable à déclarer dans un bloc.

TYPE ListeInstruction is RECORD

NomInstruction:TypeInstruction; Suivante:PtrListeI:=NULL;

END RECORD;

TYPE TypeVariable is (Reference,Valeur,Normal); TYPE ListeVariables is RECORD NomVar,TypeVar:csLine; Suivante:PtrListeV:=NULL; Param:TypeVariable:=Normal; END RECORD;

Pour les cascades de nœuds Test, nous avons décidé que les nœuds d'une même cascade partagent les paramètres en entrée cependant seuls les paramètres en entrée du premier nœud de la cascade peuvent être reliés par des arcs. Ce qui signifie que les paramètres des autres arcs ne sont pas reliés et risquent de ne pas recevoir des valeurs actuelles. Lors de la génération de code, nous associons à chaque paramètre de sortie une liste des paramètres d'entrée qui lui sont reliés. Ainsi, si un paramètre d'entrée appartient à un nœud Test, il faut considérer tous les paramètres de même nom appartenant à tous les nœuds de la même cascade. Nous avons donc besoin d'une structure qui rassemble tous les nœuds Test d'une même cascade. type NodeInCascade is record NodeId: IndexSommet; Next: PtrNodeInCascade; end record; type Cascade is record FirstNode: PtrNodeInCascade; Next: PtrCascade; end record;

Ces structures de données sont conçues pour la génération de code. Mais pour l'interfaçage avec les langages cibles, les données sont fournies sous formes de constantes de chaînes de caractères ou de constantes booléennes (variables d'états).

6.4.2.2 Les structures de données pour les codes générés

Les principales structures dont nous avons besoin sont les structures permettant d'établir les paramètres actuels (paramètres d'entrée et de sortie). En plus des valeurs de ces paramètres actuels, les structures utilisées doivent permettre de préserver les informations existant depuis la spécification pour ces paramètres. Nous avons donc les deux structures suivantes pour les paramètres d'entrées et de sortie.

type ActualInParam (DType: TypeDeBase) is record

DName : VString;

Triggering: Boolean := False; NewValue: Boolean := False; IdDNodeSource: Integer := 0; case DType is

when Logique => BoolVal: Boolean; when Entier => IntVal: Integer; when Reel => RealVal: Float;

when Caractere => CharVal: Character; when ChaineCar => StringVal: VString; end case;

end record;

type ActualOutParam (DType: TypeDeBase; NbArcs: ArcRange) is record

DName : VString;

Arcs: InParamTab(1..NbArcs); case DType is

when Logique => BoolVal: Boolean; when Entier => IntVal: Integer; when Reel => RealVal: Float;

when Caractere => CharVal: Character; when ChaineCar => StringVal: VString; end case;

162 Chapitre 6 Intégration du flot de données: Implémentation

En résumé

Le but principal de ce chapitre est de présenter et de discuter de l'enjeu principal de l'intégration du flot de données dans l'implémentation du système DIVA-cd. Pour cela nous avons présenté l'organisation des modules principaux. Il y a pourtant d'autres modules que nous n'avons pas parlé ici.

De même pour les structures de données, ce sont les principales et importantes structures de données que nous avons décrites dans ce chapitre. Les structures complets se trouvent dans les fichiers interfaces des modules concernés.

163 Avant de conclure ce rapport, nous voulons présenter dans ce chapitre quelques exemples

significatifs qui nous permettront non seulement d'illustrer les différentes notions introduites pour l'intégration du flot de données mais surtout de discuter de leurs apports par rapport à l'utilisation du système uniquement de flot de contrôle. Ainsi pour chacun des exemples, nous allons d'abord présenter une version avec seulement le flot de contrôle et puis une autre version utilisant les deux paradigmes flot de contrôle et flot de données combinés.

Nous allons présenter quatre exemples. Le premier reprend le bout de script que nous avons présente dans la figure 3.11. Il s'agit d'un petit exercice pour travailler la multiplication. Le deuxième est aussi un exercice mais pour se familiariser avec la conversion d'un nombre binaire en nombre décimal. Nous allons aussi présenter un exemple qui reprend l'illustration donnée dans [Ibrahim01a]. C'est la fusion de deux fichiers triés. Et nous terminons par la présentation des besoins de flot de données dans l'application messagerie auto-éducative appelée "Friendly Mailer" [Ibrahim93][Ibrahim95].

7.1 Exercice de multiplication

Reprenons le petit exemple (exemple 3.8) qui illustre ces différents types de nœud dans la section 3.2. On demande à un élève de donner le résultat de la multiplication de deux nombres:

• si au bout de 20s il ne répond pas, on lui demande de le faire. Une deuxième hésitation, on lui redemande encore d’entrer une valeur, mais s’il y une troisième attente de 20s, on lui donne la réponse, et on continue la leçon;

• s’il donne la bonne réponse, on le félicite et on continue la leçon;

• s’il donne une valeur qui est égale à la somme des deux nombres, on lui dit que c’est le résultat de l’addition qu’il a donné. On lui demande d’entrer le résultat de la