Pour une grammaire attribuee donnee, deux types d'elimination de regles de copie peuvent ^etre eectues. Le premier type est celui des
regles de copie menant a une constante
et le second concerne lesboucles de regles de copie
. Dans le premier cas, il s'agit des suites de regles de copie entre occurrences d'attributs telles que la premiere occurrence d'attribut de cette suite soit initialisee par une constante. Dans le second cas, il s'agit des suites de regles de copie qui debutent et terminent dans la m^eme production, c'est-a-dire qui debutent et qui terminent sur deux attributs d'un m^eme non-terminal.Les algorithmes d'elimination des regles de copie que je presente ici de facon informelle sont d^us a Roussel [Rou94]. Le but de cette presentation est de montrer que, en plus des resultats de deforestation obtenus gr^ace au passage par le formalisme des grammaires attribuees, ce m^eme formalisme et les analyses statiques qu'il autorise permettent de rearranger la grammaire attribuee obtenue et, le cas echeant, le programme fonctionnel qui peut en ^etre derive.
168 Chapitre 9. Elimination de regles de copie aglet dblrev = dblrev x ! dblrev
:
result = x:
rr x:
hr = x:
hh x:
rh = nil cons head tail!cons
:
rr = tail:
rr tail:
hr = cons:
hrcons
:
hh = cons head tail:
hh tail:
rh = cons:
rh nil ! nil:
rr = nil:
hr nil:
hh = nil:
rh dblrev hr hh rr result a b c hh rr rr rr hh hr hr hr nil rh rh rh rh hhFig. 9.1: Regle de copie de constante sur dblrev
Les principes d'evaluation des grammaires attribuees sont bases sur la notion de depen-dance entre occurrences d'attributs (section 2.2.2). Ces dependepen-dances representent l'utilisation d'une occurrence d'attribut dans la denition d'une autre mais elles ne modelisent pas le genre de fonction utilisee dans la regle semantique de cette denition. Pour l'elimination des regles de copie, la notion de dependance est etendue a la notion de
relation
engendree par une regle semantique. Celle-ci permet de modeliser, en plus de la notion de dependance classique, a la fois le fait qu'une occurrence d'attribut depend d'une constante ou non et le fait que la regle semantique qui induit la dependance est une regle d'identite (simple recopie) ou non. Brievement, une relation est un triplet (A;B;K
) qui represente le fait queB
depend deA
par une fonction modelisee parK
. Dans une telle relation,B
est une occurrence d'attribut,A
peut ^etre soit une occurrence d'attribut, soit le symbole ?qui modelise une constante etK
2fid;fonc
g modelise la fonction d'une regle semantique comme etant une regle de copie (id) ou une autre fonction (fonc) [Rou94].A partir de cette notion de relation, des analyses similaires a celles eectuees sur les dependances peuvent ^etre faites sur une grammaire attribuee: elles representent precisement le ot de donnees des attributs et plus particulierement la propagation des valeurs constantes. Elles permettent alors d'eliminer des regles de copie, par des algorithmes de transformation qui sont detailles dans [Rou94] et implantes dans le systeme Fnc-2. Le but ici n'etant pas de retranscrire ces algorithmes, je me contenterai d'exposer leurs eets dans chacun des cas d'elimination, sur des exemples qui ont deja ete rencontres dans cette these.
9.1.1 Elimination des regles de copie menant a une constante
Ce type d'elimination consiste, gr^ace aux analyses eectuees sur les notions de relations, a reperer une propagation, par des regles semantiques etant des identites, d'une valeur identiee comme etant une constante. Les occurrences d'attributs concernees par cette propagation peuvent alors ^etre denies par l'aectation de cette valeur constante plut^ot que par la regle semantique initiale.
Pour illustrer ce type de regles de copie, je presente a la gure 9.1 l'exemple de la double inversion de liste dblrev, telle qu'elle est produite par la composition symbolique. Les
occur-9.1. Deux types d'elimination de regles de copie 169
aglet dblrev2 = dblrev2 x !
dblrev2
:
result = x:
rr x:
hr = x:
hhcons head tail!
cons
:
rr = tail:
rr tail:
hr = cons:
hrcons
:
hh = cons head tail:
hh nil ! nil:
rr = nil:
hr nil:
hh = nil dblrev hr hh rr result a b c hh rr rr rr hh hr hr hr hh nilFig.9.2: Apres elimination des regle de copie de constante sur dblrev
rences de l'attribut
rh
sont toutes initialisees soit par une recopie d'une autre occurrence derh
, soit par la valeur constante nil dans le cas du prol (propagation visualisee en gras dans la gure 9.1). Il existe en fait une suite de recopies, depuis l'occurrence d'attributx:rh
du prol deni par une constante, jusqu'a l'occurrence d'attributnil:hh
du pattern (nil !); cette suite de recopies existe quel que soit l'arbre d'entree. Il est alors clair que ces regles de copie peuvent ^etre remplacees par une aectation de la valeur constante nil.Dans ce cas, la grammaire attribuee transformee devient celle presentee a la gure 9.2. Les techniques d'evaluation des grammaires attribuees, telles que la generation de sequences de visites a partir des graphes de dependances (section 2.2.4), determinent alors directement la valeur de l'occurrence d'attribut
nil:hh
du pattern (nil !); les occurrences de l'attributrh
deviennent alors des impasses statiques qui sont eliminees statiquement. Le principe d'eva-luation d'une telle grammaire attribuee, apres l'elimination de la suite de regles de copie conduisant a une constante, est represente sur le dessin de la gure 9.2.9.1.2 Elimination des boucles de regles de copie
L'autre type d'elimination qu'il est possible d'eectuer concerne les boucles de regles de copie. Intuitivement, il s'agit d'une passe ou d'un parcours sur (un sous-arbre de) l'arbre d'entree, qui propage une valeur sans la modier. Dans ce cas, il existe deux attributs sur un m^eme non-terminal qui sont respectivement le debut et la n de la suite de regles de copie. L'exemple de la gure 9.1 contient une telle boucle, qui va de
x:hh
ax:rr
dans le prol, mais je vais illustrer sur un exemple encore plus probant.Je presente a la gure 9.3 l'exemple de la grammaire attribuee rev at produite par la composition symbolique de rev et de at (cette composition symbolique est decrite a la section 8.2). Cette grammaire attribuee rev at contient egalement une boucle de regle de copie, qui va de
t:lh
at:fr
sur le prol; elle est mise en evidence en gras sur l'exemple de la gure 9.3. Dans ce cas, l'algorithme d'elimination des boucles de regles de copie permet de remplacer la regle semantique du prol rev at:
result = t:
fr par rev at:
result = t:
lh, rendant ainsi les calculs defr
, et donc delr
, inutiles pour la valeur semantique de l'arbre d'entree. La grammaire attribuee R at ainsi obtenue est presentee a la gure 9.4, avec un dessin illustrant son evaluation sur un exemple.170 Chapitre 9. Elimination de regles de copie aglet rev at = rev at t ! rev at
:
result = t:
fr t:
fh = nil t:
lr = t:
lh node left right !node
:
fr = left:
fr left:
fh = node:
fh left:
lr = right:
fr right:
fh = left:
lh right:
lr = node:
lr node:
lh = right:
lh leaf n ! leaf:
fr = leaf:
lrleaf
:
lh = cons n leaf:
fhnil a b c revflat result fh lh fh lh lh fh fh lh fh fr lr fr lr lr fr fr lr lr fr lh
Fig. 9.3: Boucle de regles de copie dans rev at
agletR at = R at t !
R at
:
result = t:
lh t:
fh = nilnode left right !
left
:
fh = node:
fh right:
fh = left:
lh node:
lh = right:
lh leaf n !leaf
:
lh = cons n leaf:
fhnil a b c result fh lh fh lh lh fh fh lh fh lh Rflat