• Aucun résultat trouvé

Chapitre 4 Implantation de l’atelier

4.6 Le gestionnaire de formats

4.6.1 L’interprète

L’interprète de macro-définitions est une spécialisation du gestionnaire de formats ( f. fi-

gure 4.10). Les classes de l’interprète sont présentées à la figure 4.11. Le diagramme de séquence

Interprète GesFormats

Figure 4.10 – Classes du gestionnaire de formats

de la figure 4.12 présente l’utilisation de l’interprète pour effectuer une traduction. En notes sur la figure 4.12 sont présentés les éléments correspondant à l’exemple 4.4.

51 binding

4.6. Le gestionnaire de formats 127

M ac roDef headI dent if ier : S t ring

headF orm alP aram et ers : V ect or t ail : V ect or

m ac roConst ruct or : S t ring

< < c onst ruct or> > M acroDef (m : M acroDef )

< < c onst ruct or> > M acroDef (ligneLue : S t ring, int erpret e : I nt erpret e)

< < c onst ruct or> > M acroDef (ligneLue : S t ring, m Const ruct or : S t ring, int erpret e : I nt erpret e) < < c onst ruct or> > M acroDef ()

set HeadI dent if ier(headI d : S t ring) : v oid set HeadF orm alP aram et ers(headF orm alP aram ) : void set T ail(t ailP aram : V ect or) : void

get HeadI dent if ier() : S t ring get HeadF orm alP aram et ers() : V ect or get T ailV ect or() : V ec t or get T ail() : S t ring

get HeadF orm alP aram et ers() : S t ring t raduit (param E f f ect if s : V ect or) : S t ring t oS t ring() : S t ring

addT ail(t ailChaine : S t ring) : void

lireM acro(ligneLue : S t ring, int erpret e : Interprete) : void f orm at eChaine(chaine : S t ring) : S t ring

(f rom I nt erpret e) I nt erpret e

m ac roS e t : Hasht able m ac roCo nst ruc tor : S t ring t arget LanguageS eparat or : S t ring s our ceLa ngua geS ep ara tor : S t ring m ac roS e t T er m in ato r : S t rin g m ac roT erm inat or : S t ring < < c onst ru ct o r> > Int er pre te()

< < c onst ru cto r> > I nt erpre t e( nom F ic hi er M ac roS et : S tring ) set M acroConst ruct or(m Cons t ruc t eur : S t ring) : void g etM ac roCo nst ruc tor () : S t ring

s etT a rge t La ngua geS ep ara t or () : v oid g et T a rge tLa ngua geS ep ara toir () : S t ring

s etS o urc eLan guag eS epa rat or (se par ate ur : S tr ing) : vo id g et S o urc eLan guag eS epa rat or () : S t ring

a ddM acr oDef (m : Ma cro Def) : v oid

e xis ting Ma cro Head( ident ifi cat eur : S t ring ) : B ool ean m ac roCo rr espo ndan te(i dent i ficat eur : S t ring ) : Ma cro Def l ire Ma cro S et( nom F ic hi er M ac roS et : S tring ) : void t ra dui t( nom F i chier A T ra dui re : S t ri ng) : S t ring f or ma teCh aine( chaine : S t ri ng) : S t ring

(f rom I nt erpret e)

Figure 4.11 – Classes de l’interprète

: A telier : Interprete

s etM ac roCons truc tor(m Cons truc teur : S tring)

s et TargetLanguage Sep arat or( separ ateur : S t ri ng)

s etS ourc eLanguageS eparator(s eparateur : S tring)

li reM ac r oS et( nomF i chi erM acr oSe t : S t ri ng)

traduit(nom F ic hierA Traduire : S tring)

"::= "

", "

" ,"

fic hier ex em ple1.m s t :

A LIG NE S (P 1, P 2, P 3) ::= P 3 e (P 1 P 2)

fic hier ex em ple1.hdl :

A LIG NE S (A , B , C), A LIG NE S (A , B , E ). rés ultat de traduit

c haine :

C e ( A B ), E e ( A B )

Figure 4.12 – Exemple de traduction

Exemple 4.4 Le  hier ontenant l'énon é à traduire est fichier1.hdl:

ALIGNES (A, B, C), ALIGNES (A, B, E).

Le  hier ontenant les ma ro-dénitionsest fichier1.mst:

ALIGNES (P1, P2, P3) ::= P3 e (P1 P2)

Le onstru teurde ma ro dénition est ::=

Leséparateurd'atomesdanslelangage ibleestunevirgulesuivied'unespa e.Lesépara- teurd'atomesdanslelangagesour eestunevirgule.Leterminateurdema ro-dénitions est unpoint.

La méthode lireMacroSet() consiste à lire le fichier en entrée et à construire une macro- définition pour chaque atome. Le résultat de l’application de la méthode lireMacroSet() sur la macro-définition de l’exemple 4.4 donne la table 4.1.

Les macro-définitions ainsi construites sont stockées dans une table de hashage appelée macroSet dans l’interprète.

128 Chapitre 4. Implantation de l'atelier

Objet Nom Valeur

String headIdentifier ALIGNES Vector headFormalParameters [P1, P2, P3]

Vector tail [3, , e, , (, , 1, , 2, , )]

Table 4.1 – Exemple de lecture de Macro-définitions.

La méthode «traduit» de l’objet Interprete consiste à lire le fichier en entrée (l’énoncé), atome par atome et à construire une chaîne contenant le résultat de la traduction. Pour chaque atome correspondant à une macro-définition, il recherche la macro correspondante, puis fabrique le vec- teur recevant les paramètres effectifs. Pour le premier atome ALIGNES (A, B, C), il existe une macro-définition correspondant. Les paramètres effectifs sont : [A, B, C]. Ensuite, il passe ces paramètres effectifs à la méthode «traduit» de l’objet MacroDef construit. L’algorithme de cette méthode présente le principe de la traduction ( f.algorithme 7 p 128). Pour le premier atome de

Algorithme 7 Méthode «traduit» de la classe MacroDef

Prérequis: (paramètre) un vecteur contenant les chaînes des paramètres effectifs : Vector

paramEffectifs

Prérequis: (attribut local) un vecteur contenant la queue de la macro : Vector tail Prérequis: (à savoir) le i ième élément d’un Vector est à l’indice i-1

Produit: la traduction : String stringTail

1: /* Initialisations */ String stringTail = new String("") ; int i, indiceParam ; 2: pour i=1 ;i<=tail.size() ;i++ faire

3: /* Pour chaque élément de la tête */

4: si tail.elementAt(i-1) instanceof String alors

5: /* l’élément n’est pas un paramètre — on le copie dans le résultat */

stringTail = stringTail.concat(tail.elementAt(i-1).toString()) ;

6: sinon

7: /* L’élément est un entier qui désigne la place du paramètre effectif dans le vecteur

paramEffectif */

8: si tail.elementAt(i-1) instanceof Integer alors 9: indiceParam = tail.elementAt(i-1) ;

10: /* On copier le paramètre effectif correspondant dans le résultat */

stringTail = stringTail.concat(paramEffectifs.elementAt(indiceParam-1).toString()) ; 11: sinon 12: /* traitement d’exception */ . . . 13: finsi 14: finsi 15: fin pour

l’exemple 4.4 (ALIGNES (A, B, C)), l’algorithme 7 construit une chaîne composée par la conca- ténation des chaînes. Ces chaînes sont recopiées depuis le corps de la macro-définition (tail). Si

4.6. Le gestionnaire de formats 129

I (i-1) ième élément du vecteur tail Élément ajouté à la chaîne résultat

1 3 C 2 espa e espa e 3 espa ee espa ee 4 espa e espa e 5 espa e( espa e( 6 espa e espa e 7 1 A 8 espa e espa e 9 2 B 10 espa e espa e 11 espa e) espa e)

Table 4.2 – Exemple d’application de la méthode «codetraduit»

l’élément du corps est une chaîne il est recopié tel quel. Si c’est un nombre, il correspond à un paramètre effectif par position. L’application de la méthode «traduit» sur la macro-définition de l’exemple 4.4 donne la table 4.2.

La chaîne résultat est donc : C e ( A B ). Aspects techniques

Pour implanter l’interprète, nous avons étudié l’implantation de traducteurs [Bolc 87, Pollack 72, Yellin 88]. L’implantation de l’interprète de macro-définition a d’abord été écrite en Prolog. En effet, au début du projet, nous avons montré l’intérêt de cette notion (macro-définition) dans le domaine de la géométrie pour les logiciels TALC et Mentoniezh (voir annexe C).TALC et Mentoniezh ayant été développés sous Prolog sur Macintosh, il était plus aisé d’implanter l’in-

terprète en Prolog. Cependant, afin de pouvoir l’utiliser avec d’autres outils écrits dans d’autres langages et sur d’autres plate-formes matérielles, nous avons cherché à utiliser un interprète de Prolog écrit en JAVA52, que nous avons déployé. Ce test a été effectué sur PC, sur station unix

et sur console JAVA53

Cette solution s’est avérée désastreuse (beaucoup trop lente). En effet, nous nous retrouvons alors avec trois couches successives d’interprétation : l’interprétation des macro-définitions, via l’interprétation des prédicats Prolog, via l’interprétation du code source dans la machine virtuelle JAVA. Finalement l’interprète de macro-définitions a été réécrit direc- tement en JAVA.