dagletfact = Grammaire attribuee dynamique fact dynfact n! Le prol fait reference
fact
:
result = dynfact:
f a un non-terminal dynamique (dynfact) dynfact:
h = n Le parametre n devient un attribut hh (dynfact
:
h>
= 1);
dont la valeur determine l'applicationh dynfact rec! d'une production dynamique (recursive) dynfact
:
f = dynfact:
h rec:
frec
:
h = dynfact:
h 1 ih dynfact! ou de l'autre (terminale) dynfact
:
f = 1 i iFig. 4.1: La fonction factorielle dans une pseudo-syntaxe de grammaire attribuee dynamique
4.2 Grammaires attribuees dynamiques
Dans les denitions des grammaires attribuees donnees au chapitre 2, il peut y avoir une ambigute dans l'utilisation du symbole
Xi
. Dans une denition de CFG, il represente un non-terminal tandis que dans une grammaire attribuee, il represente a la fois l'occurrence d'un non-terminal (libelle par sa position dans la production) et le non-terminal lui m^eme (en tant que type). Cependant, la position d'un nom dans une production n'est importante que s'il s'agit deX
0, ou bien pour distinguer deux occurrences d'un non-terminal et de leur type. Je considererai donc ici une production comme un ensemble de noms distincts (avec un nom particulier pour la partie gauche de la production), chacun associe a un type.Denition 4.2.1 (Production)
Soit V un ensemble universel ni de noms de variables. Une productionp
:X
0!
X
1:::Xn
dans une CFG est un tuple ((X
0;
Vp);typep
) dans lequel: i. Vp =fX
1;X
2;:::;Xn
gV, avecn
=Card
(Vp) etX
0 2V Vp; ii.typep
:V p !N
[T
, ouV p =fX
0g[Vp est une fonction qui associe a chaque nom un unique type dans l'ensemble des terminaux et des non-terminaux, tels que
typep
(X
0)2N
.2
Dans la suite de ce chapitre, j'utiliserai pour une production
p
la plus claire des notations en fonction du contexte, entrep
:X
0!
X
1:::Xn
et ((X
0;
Vp);typep
).Dans ce chapitre, j'utiliserai les notations usuelles relatives aux productions:
LHS
(p
) =X
0 etRHS
(p
) =VpLa base d'une grammaire attribuee dynamique est donc la grammaire decrivant le ot de contr^ole (schema de recursion) de l'application representee. Ce ot de contr^ole peut dependre des valeurs des attributs, mais aussi egalement de la forme d'un arbre physique, qui doit alors ^etre un parametre particulier de l'evaluateur. Il faut donc non seulement faire la dierence, mais de plus etablir une relation entre la grammaire qui decrit la structure concrete et celle qui decrit le schema de calcul et qui, d'une certaine facon, \contient" la premiere. C'est l'intuition
46 Chapitre 4. Grammaires attribuees dynamiques de la notion de couple de grammaires. La denition 4.2.2 est d'abord donnee formellement, puis commentee dans le paragraphe suivant.
Denition 4.2.2 (Couple de grammaires)
Uncouple de grammaires
est un tripletG
= (Gd;Gc;
Concrete
) forme de deux grammaires independantes du contextesGd
etGc
et d'une fonction Concrete
, ouGd
= (Nd;Td;Zd;Pd
) est appelee la grammairedynamique
,Gc
= (Nc;Tc;Zc;Pc
) est appelee la grammaireconcrete
et ouC
oncrete
:Pd
V !(Pc
V)[f?g, telles qu'elles verient:1.
Nc
Nd
;Td
=Tc
;Si
Gc
n'est pas vide1 alorsZd
=Zc
. 2. 8pd
2Pd
, on a: i. 8X
2V pd,typep
d(X
)2(Nd Nc
)) Concrete
(pd;X
) =?; ii.typep
d(LHS
(pd
))2(Nd Nc
) )8X
2RHS
(pd
),typep
d(X
)2(Nd Nc
); iii.typep
d(LHS
(pd
))2Nc
)9!pc
2Pc
tel que:{ C
oncrete
(pd;LHS
(pd
)) = (pc;LHS
(pc
)) ettypep
d(LHS
(pd
)) =typep
c(LHS
(pc
)); { 8X
2RHS
(pd
),typep
d(X
)2Nc
)9Y
2V
pc tel que
C
oncrete
(pd;X
) = (pc;Y
) ettypep
d(X
) =typep
c(Y
). 3. 8p;q
2Pd
tel quetypep
(LHS
(p
)) =typeq
(LHS
(q
)) etC
oncrete
(p;LHS
(p
)) =Concrete
(q;LHS
(q
)), on a: i.LHS
(p
) =LHS
(q
);ii. 8
X
2Vp\Vq;typep(X
) =typeq
(X
);iii. 8
X
2Vp\Vq;Concrete
(p;X
) =Concrete
(q;X
).2
Avec les contraintes ci-dessus, la fonction C
oncrete
, qui est initialement denie pour un nom dans une production, peut ^etre etendue sans ambigute aux productionspd
dePd
de la facon suivante:C
oncrete
(pd
) =
pc si
Concrete
(pd;LHS
(Pd
)) = (pc;LHS
(pc
))?
si
Concrete
(pd;LHS
(Pd
)) =?Dans la denition 4.2.2,
Gd
etGc
representent respectivement les grammaires dynamique et concrete ; la fonctionConcrete
fournit la production (ou le nom) concrete correspondant a une production (ou un nom) dynamique donnee, c'est-a-dire un arbre (ou un nud) physique.1. Dans les cas de programmes sans aucune structure, tels que la fonction factorielle, Gcpeut ^etre vide et
Concretefait correspondre?a tous les elements (cf. productions dynamiques recursive et terminale dedynfact
4.2. Grammaires attribuees dynamiques 47 Production concrete double2Pc
double : lhs !rhs Production dynamique doubledyn
2Pd
doubledyn : simple !rst second avec
Concrete(doubledyn) = double
Concrete(doubledyn
;
simple) = (double;
lhs)Concrete(doubledyn
;
rst) = Concrete(doubledyn;
second) = (double;
rhs)Fig.4.2: Partie d'un couple de grammaires pour la fonction
double
Lorsque la valeur fournie par cette fonction est ?(indeni), cela signie que l'argument est un objet purement dynamique, ou \abstrait"; il correspond a un schema de recursion pur.
La condition 2.i de la denition 4.2.2 signie que dans une production dynamique, un non-terminal qui n'appartient pas a la grammaire conrete est associe a ? par la fonction
C
oncrete
; il est alors dit purement dynamique.La condition 2.ii precise que si le non-terminal en partie gauche d'une production dyna-mique est lui m^eme purement dynadyna-mique, alors toute la production est purement dynadyna-mique, c'est-a-dire que tous les non-terminaux en partie droite le sont. Intuitivement, une structure concrete ne peut pas ^etre derivee a partir d'un schema de recursion purement abstrait.
La condition 2.iii stipule par contre que si le non-terminal en partie gauche d'une produc-tion dynamique
pd
appartient egalement a la grammaire concrete, alors il existe une unique production concretepc
associee, de m^eme non-terminal en partie gauche. Dans ce cas, a tout non-terminal apparaissant en partie droite de la production dynamiquepd
et appartenant a la grammaire concrete, il existe un non-terminal dans la production concretepc
qui lui est associe. Intuitivement, il faut que les elements concrets apparaissant dans une production dynamiques puissent ^etre retrouves dans la production concrete associee.Une production dynamique
pd
est donc soit purement abstraite, soit associee a une unique production concretepc
, qui est de m^eme type en partie gauche et pour tous les non-terminaux de type concret en partie droite depd
, il existe un non-terminal correspondant de m^eme type danspc
.Cependant, une structure physique donnee (non-terminal concret) peut ^etre referencee plus d'une fois dans une production dynamique. Cette possibilite est illustree par l'exemple de la fonction
double
(gure 4.2) qui est un exemple bien connu [DJL88] des limitations du formalisme classique des grammaires attribuees.Par ailleurs, une partie gauche concrete, qui est par denition associee a une partie gauche dynamique (condition 1), peut egalement ^etre referencee dans la partie droite de la production dynamique. C'est le cas dans l'exemple du
while
(gure 4.3) qui servira tout au long de ce chapitre. Ces particularites et ces \eets speciaux" sont l'essence m^eme des grammaires attribuees dynamiques. Il permettent de specier des calculs qui n'etaient pas exprimables avec les grammaires attribuees classiques.Finalement, la condition 3 de la denition 4.2.2 formalise la contrainte que, pour deux productions de m^eme type en partie gauche et de m^emeC
oncrete
2 associe, les parties gauches doivent avoir le m^eme nom et tous les noms communs aux deux productions doivent ^etre de48 Chapitre 4. Grammaires attribuees dynamiques Production concrete p 2Pc
p: while !cond body Productions dynamiques pr et pt
2Pd
pr : while !cond body loop pt : while!cond
avec
Concrete(pr) = Concrete(pt) = (p)
Concrete(pr
;
while) = Concrete(pt;
while) = (p;
while) Concrete(pr;
cond) = Concrete(pt;
cond) = (p;
cond) Concrete(pr;
body) = (p;
body)Concrete(pr
;
loop) = (p;
while)Fig. 4.3: Partie d'un couple de grammaires pour l'instruction
while
m^eme type. Ceci implique en particulier que si leC
oncrete
d'un tel nom commun est deni (6=?), alors ce nom represente eectivement le m^eme objet concret.Pour illustrer les notions presentees, je prends comme exemple la denition d'une partie de la semantique dynamique d'un langage de programmation contenant des boucles, avec une grammaire attribuee dynamique decrivant un interpreteur. Cette application n'est pas traitable avec les grammaires attribuees classiques. La gure 4.3 presente la structure de l'instruction
while
comme une partie d'un couple de grammaires (Gd;Gc;
Concrete
) ou cond est du type COND 2Nd
[Nc
representant une condition booleenne et ou tous les autres noms dans les productions sont du type STMT 2Nd
[Nc
representant des instructions.p
2Pc
est la production concrete qui specie qu'une instructionwhile
est constituee d'une condition et d'un ensemble d'instructions.pr
etpt
2Pd
sont deux productions dynamiques qui representent respectivement le comportement recursif et terminal d'une bouclewhile
; la production concrete associee a ces deux productions dynamiques estp
.Un bloc de regles semantiques est une structure conditionnelle (un arbre de decision) qui denit toutes les productions dynamiques qui sont applicables a un m^eme endroit (c'est-a-dire qui sont associees soit a une m^eme production concrete, soit au m^eme non-terminal purement dynamique, cf. contraintes de la denition 4.2.5 un peu plus loin) avec leurs regles semantiques et l'ensemble des conditions qui permettent de choisir la production a appliquer.
Denition 4.2.3 (Bloc de regles semantiques)
Unbloc de regles semantiques b
est deni inductivement comme suit:b
=hR;
he;b;b
iijhp;R
iou
R
est un ensemble (eventuellement vide) de regles semantiques (inconditionnelles),e
est une condition (expression booleenne sur des occurrences d'attributs) etp
est une production.2
La gure 4.4 presente le bloc de regles semantiques decrivant la semantique (de facon denotationnelle) de l'instruction
while
. Les attributs henv (herite) et senv (synthetise) repre-sentent l'environnement d'execution (memoire, etc) d'une instruction et l'attribut val contient la valeur de la condition.4.2. Grammaires attribuees dynamiques 49
h cond
:
henv = while:
henv;
{ regle semantique classique Rh(cond
:
val);
{ expression booleenneh while!cond body loop
;
{ cas true: hpr;R
0 ibody
:
henv = while:
henv loop:
henv = body:
senv while:
senv = loop:
senv ih while!cond
;
{ cas false:hpt;R
0 0 iwhile
:
senv = while:
henv i i iFig. 4.4: Le bloc de regles semantiques pour l'instruction
while
f( ((cond
:
val;
true);
while!cond body loop);
cond:
henv = while:
henvbody
:
henv = while:
henv loop:
henv = body:
senv while:
senv = loop:
senv ) ( ((cond:
val;
false);
while !cond);
cond
:
henv = while:
henv while:
senv = while:
henv )gFig.4.5: L'ensemble Rb pour l'instruction
while
Dans un bloc, les regles semantiques sont associees a n'importe quel nud de l'arbre de decision tandis que les productions apparaissent uniquement aux feuilles. La denition sui-vante montre comment un bloc peut ^etre \aplati" en une collection de productions classiques | avec leurs regles semantiques.
Denition 4.2.4 (Ensemble
Rb)
Pour chaque blocb
,Rb est l'ensemble de toutes les regles semantiques deb
,qualiees
par la conjonction des conditions (qui peut ^etre vue comme un \chemin") qui contraignent leur application et par la production a laquelle elles sont attachees. L'ensembleRb est inductivement deni comme suit:R
hp;Ri=f((
";p
);R
)gR
hR;he;btrue;bfalse ii=
let Rbtrue =[i((
ci;pi
);Ri
);
Rbfalse =[j((cj;pj
);Rj
) in [i(((e;true
):ci;pi
);R
[Ri
)S[j(((
e;false
):cj;pj
);R
[Rj
)2
L'ensembleRb pour l'exemple du
while
est presente a la gure 4.5.Pour un bloc de regles semantiques donne
b
, on denit PRb comme l'ensemble de toutes les productions deb
: PRb = fp
j ((c;p
);R
) 2 Rbg. On dit que la paire ((c;p
);R
) est bien formee si l'ensembleR
de regles semantiques est bien forme pour la productionp
et que chaque conditione
dans le cheminc
(conjonction de conditions) ne refere que des occurrences d'attributs d'entree dep
.50 Chapitre 4. Grammaires attribuees dynamiques Il est maintenant possible de denir completement les grammaires attribuees dynamiques.
Denition 4.2.5 (Grammaire attribuee dynamique)
Unegrammaire attribuee
dy-namique
est un tupleAG
= (G;A;F
) ou:{
G
= (Gd;Gc;
Concrete
) est un couple de grammaires; {A
=SX2Nd
H
(X
)]S
(X
) est un ensemble d'attributs; {F
est un ensemble de blocs de regles semantiques tel que:1. 8
b
2F
, chaque ((c;p
);R
)2Rb est bien forme; 2. 8p
2Pd;
9!b
2F
tel quep
2PRb;3. 8
p;q
2Pd
, avecp
2PRbi etq
2PRbj, tels quetypep
(LHS
(p
)) =typeq
(LHS
(q
)) =X
, on a:{
X
2(Nd Nc
))bi
=bj
;{
X
2Nc
)(bi
=bj
,Concrete
(p
) =Concrete
(q
)).2
En fait, une grammaire attribuee dynamique decrit une fonction qui prend comme argu-ments
{ les valeurs de tous les attributs herites du symbole de depart (puisque ceux-ci ne sont plus interdits) et
{ un arbre concret decrit par la grammaire, si dans le couple de grammaires celle-ci n'est pas vide,
et qui retourne la valeur de l'attribut synthetise du symbole de depart. Le calcul des attributs est deni de facon triviale; il est guide a chaque nud dynamique par les valeurs des dierentes conditions et, le cas echeant, par la production appliquee au nud concret correspondant.