• Aucun résultat trouvé

Deux types d'elimination de regles de copie

Pour une grammaire attribuee donnee, deux types d'elimination de regles de copie peuvent ^etre e ectues. Le premier type est celui des

regles de copie menant a une constante

et le second concerne les

boucles 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

:

hr

cons

:

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 hh

Fig. 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 de nition d'une autre mais elles ne modelisent pas le genre de fonction utilisee dans la regle semantique de cette de nition. 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 que

B

depend de

A

par une fonction modelisee par

K

. 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 et

K

2f

id;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 e ectuees 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 e ets 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 e ectuees sur les notions de relations, a reperer une propagation, par des regles semantiques etant des identites, d'une valeur identi ee comme etant une constante. Les occurrences d'attributs concernees par cette propagation peuvent alors ^etre de nies par l'a ectation 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

:

hh

cons head tail!

cons

:

rr = tail

:

rr tail

:

hr = cons

:

hr

cons

:

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 nil

Fig.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 de

rh

, soit par la valeur constante nil dans le cas du pro l (propagation visualisee en gras dans la gure 9.1). Il existe en fait une suite de recopies, depuis l'occurrence d'attribut

x:rh

du pro l de ni par une constante, jusqu'a l'occurrence d'attribut

nil: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 a ectation 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'attribut

rh

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'e ectuer 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 modi er. 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

a

x:rr

dans le pro l, 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

a

t:fr

sur le pro l; 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 pro l rev at

:

result = t

:

fr par rev at

:

result = t

:

lh, rendant ainsi les calculs de

fr

, et donc de

lr

, 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

:

lr

leaf

:

lh = cons n leaf

:

fh

nil 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 = nil

node left right !

left

:

fh = node

:

fh right

:

fh = left

:

lh node

:

lh = right

:

lh leaf n !

leaf

:

lh = cons n leaf

:

fh

nil a b c result fh lh fh lh lh fh fh lh fh lh Rflat