• Aucun résultat trouvé

dagletfact = Grammaire attribuee dynamique fact dynfact n! Le pro l fait reference

fact

:

result = dynfact

:

f a un non-terminal dynamique (dynfact) dynfact

:

h = n Le parametre n devient un attribut h

h (dynfact

:

h

>

= 1)

;

dont la valeur determine l'application

h dynfact rec! d'une production dynamique (recursive) dynfact

:

f = dynfact

:

h rec

:

f

rec

:

h = dynfact

:

h 1 i

h dynfact! ou de l'autre (terminale) dynfact

:

f = 1 i i

Fig. 4.1: La fonction factorielle dans une pseudo-syntaxe de grammaire attribuee dynamique

4.2 Grammaires attribuees dynamiques

Dans les de nitions des grammaires attribuees donnees au chapitre 2, il peut y avoir une ambigute dans l'utilisation du symbole

Xi

. Dans une de nition 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 de

X

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.

De nition 4.2.1 (Production)

Soit V un ensemble universel ni de noms de variables. Une production

p

:

X

0

!

X

1

:::Xn

dans une CFG est un tuple ((

X

0

;

Vp)

;typep

) dans lequel: i. Vp =f

X

1

;X

2

;:::;Xn

gV, avec

n

=

Card

(Vp) et

X

0 2V Vp; ii.

typep

:V  p !

N

[

T

, ouV  p =f

X

0

g[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)2

N

.

2

Dans la suite de ce chapitre, j'utiliserai pour une production

p

la plus claire des notations en fonction du contexte, entre

p

:

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 et

RHS

(

p

) =Vp

La 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 di erence, 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 de nition 4.2.2 est d'abord donnee formellement, puis commentee dans le paragraphe suivant.

De nition 4.2.2 (Couple de grammaires)

Un

couple de grammaires

est un triplet

G

= (

Gd;Gc;

C

oncrete

) forme de deux grammaires independantes du contextes

Gd

et

Gc

et d'une fonction C

oncrete

, ou

Gd

= (

Nd;Td;Zd;Pd

) est appelee la grammaire

dynamique

,

Gc

= (

Nc;Tc;Zc;Pc

) est appelee la grammaire

concrete

et ou

C

oncrete

:

Pd

V !(

Pc

V)[f?g, telles qu'elles veri ent:

1.

Nc



Nd

;

Td

=

Tc

;

Si

Gc

n'est pas vide1 alors

Zd

=

Zc

. 2. 8

pd

2

Pd

, on a: i. 8

X

2V  pd,

typep

d(

X

)2(

Nd Nc

)) C

oncrete

(

pd;X

) =?; ii.

typep

d(

LHS

(

pd

))2(

Nd Nc

) )8

X

2

RHS

(

pd

),

typep

d(

X

)2(

Nd Nc

); iii.

typep

d(

LHS

(

pd

))2

Nc

)9!

pc

2

Pc

tel que:

{ C

oncrete

(

pd;LHS

(

pd

)) = (

pc;LHS

(

pc

)) et

typep

d(

LHS

(

pd

)) =

typep

c(

LHS

(

pc

)); { 8

X

2

RHS

(

pd

),

typep

d(

X

)2

Nc

)9

Y

2V



pc tel que

C

oncrete

(

pd;X

) = (

pc;Y

) et

typep

d(

X

) =

typep

c(

Y

). 3. 8

p;q

2

Pd

tel que

typep

(

LHS

(

p

)) =

typeq

(

LHS

(

q

)) et

C

oncrete

(

p;LHS

(

p

)) =C

oncrete

(

q;LHS

(

q

)), on a: i.

LHS

(

p

) =

LHS

(

q

);

ii. 8

X

2Vp\Vq;typep(

X

) =

typeq

(

X

);

iii. 8

X

2Vp\Vq;C

oncrete

(

p;X

) =C

oncrete

(

q;X

).

2

Avec les contraintes ci-dessus, la fonction C

oncrete

, qui est initialement de nie pour un nom dans une production, peut ^etre etendue sans ambigute aux productions

pd

de

Pd

de la facon suivante:

C

oncrete

(

pd

) =



pc si

C

oncrete

(

pd;LHS

(

Pd

)) = (

pc;LHS

(

pc

))

?

si

C

oncrete

(

pd;LHS

(

Pd

)) =?

Dans la de nition 4.2.2,

Gd

et

Gc

representent respectivement les grammaires dynamique et concrete ; la fonctionC

oncrete

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 ?(inde ni), cela signi e que l'argument est un objet purement dynamique, ou \abstrait"; il correspond a un schema de recursion pur.

La condition 2.i de la de nition 4.2.2 signi e 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 concrete

pc

associee, de m^eme non-terminal en partie gauche. Dans ce cas, a tout non-terminal apparaissant en partie droite de la production dynamique

pd

et appartenant a la grammaire concrete, il existe un non-terminal dans la production concrete

pc

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 concrete

pc

, qui est de m^eme type en partie gauche et pour tous les non-terminaux de type concret en partie droite de

pd

, il existe un non-terminal correspondant de m^eme type dans

pc

.

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 de nition 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 \e ets speciaux" sont l'essence m^eme des grammaires attribuees dynamiques. Il permettent de speci er des calculs qui n'etaient pas exprimables avec les grammaires attribuees classiques.

Finalement, la condition 3 de la de nition 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 de

48 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 de ni (6=?), alors ce nom represente e ectivement le m^eme objet concret.

Pour illustrer les notions presentees, je prends comme exemple la de nition 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;

C

oncrete

) ou cond est du type COND 2

Nd

[

Nc

representant une condition booleenne et ou tous les autres noms dans les productions sont du type STMT 2

Nd

[

Nc

representant des instructions.

p

2

Pc

est la production concrete qui speci e qu'une instruction

while

est constituee d'une condition et d'un ensemble d'instructions.

pr

et

pt

2

Pd

sont deux productions dynamiques qui representent respectivement le comportement recursif et terminal d'une boucle

while

; la production concrete associee a ces deux productions dynamiques est

p

.

Un bloc de regles semantiques est une structure conditionnelle (un arbre de decision) qui de nit 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 de nition 4.2.5 un peu plus loin) avec leurs regles semantiques et l'ensemble des conditions qui permettent de choisir la production a appliquer.

De nition 4.2.3 (Bloc de regles semantiques)

Un

bloc de regles semantiques b

est de ni inductivement comme suit:

b

=h

R;

h

e;b;b

iijh

p;R

i

ou

R

est un ensemble (eventuellement vide) de regles semantiques (inconditionnelles),

e

est une condition (expression booleenne sur des occurrences d'attributs) et

p

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 R

h(cond

:

val)

;

{ expression booleenne

h while!cond body loop

;

{ cas true: h

pr;R

0 i

body

:

henv = while

:

henv loop

:

henv = body

:

senv while

:

senv = loop

:

senv i

h while!cond

;

{ cas false:h

pt;R

0 0 i

while

:

senv = while

:

henv i i i

Fig. 4.4: Le bloc de regles semantiques pour l'instruction

while

f( ((cond

:

val

;

true)

;

while!cond body loop)

;

cond

:

henv = while

:

henv

body

:

henv = while

:

henv loop

:

henv = body

:

senv while

:

senv = loop

:

senv ) ( ((cond

:

val

;

false)

;

while !cond)

;

cond

:

henv = while

:

henv while

:

senv = while

:

henv )g

Fig.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 de nition sui-vante montre comment un bloc peut ^etre \aplati" en une collection de productions classiques | avec leurs regles semantiques.

De nition 4.2.4 (Ensemble

Rb

)

Pour chaque bloc

b

,Rb est l'ensemble de toutes les regles semantiques de

b

,

quali ees

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 de ni comme suit:

 R

hp;Ri=f((

";p

)

;R

)g

 R

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 de nit PRb comme l'ensemble de toutes les productions de

b

: PRb = f

p

j ((

c;p

)

;R

) 2 Rbg. On dit que la paire ((

c;p

)

;R

) est bien formee si l'ensemble

R

de regles semantiques est bien forme pour la production

p

et que chaque condition

e

dans le chemin

c

(conjonction de conditions) ne refere que des occurrences d'attributs d'entree de

p

.

50 Chapitre 4. Grammaires attribuees dynamiques Il est maintenant possible de de nir completement les grammaires attribuees dynamiques.

De nition 4.2.5 (Grammaire attribuee dynamique)

Une

grammaire attribuee

dy-namique

est un tuple

AG

= (

G;A;F

) ou:

{

G

= (

Gd;Gc;

C

oncrete

) est un couple de grammaires; {

A

=S

X2Nd

H

(

X

)]

S

(

X

) est un ensemble d'attributs; {

F

est un ensemble de blocs de regles semantiques tel que:

1. 8

b

2

F

, chaque ((

c;p

)

;R

)2Rb est bien forme; 2. 8

p

2

Pd;

9!

b

2

F

tel que

p

2PRb;

3. 8

p;q

2

Pd

, avec

p

2PRbi et

q

2PRbj, tels que

typep

(

LHS

(

p

)) =

typeq

(

LHS

(

q

)) =

X

, on a:

{

X

2(

Nd Nc

))

bi

=

bj

;

{

X

2

Nc

)(

bi

=

bj

,C

oncrete

(

p

) =C

oncrete

(

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 de ni de facon triviale; il est guide a chaque nud dynamique par les valeurs des di erentes conditions et, le cas echeant, par la production appliquee au nud concret correspondant.