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.