HAL Id: hal-00628154
https://hal-upec-upem.archives-ouvertes.fr/hal-00628154
Submitted on 30 Sep 2011
HAL is a multi-disciplinary open access archive for the deposit and dissemination of sci-entific research documents, whether they are pub-lished or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers.
L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des établissements d’enseignement et de recherche français ou étrangers, des laboratoires publics ou privés.
Transformation de grammaires attribuées pour des mises
à jour destructives
Étienne Duris
To cite this version:
Étienne Duris. Transformation de grammaires attribuées pour des mises à jour destructives. [Rapport de recherche] Université d’Orléans. 1994. �hal-00628154�
Evaluateur Abstrait Génération des Visite Séquences de Optimiseur mémoire lisp C ... Back End Evaluateurs Front End Compile time Run time Résultat Arbre d’entrée lisp C ... l-ordonnée) (FNC, DNC Tests de Caractérisation (olga, asx) Spécification d’une Grammaire Attribuée Générateur d’Evaluateurs
AXIOM-TREE TREE TREE TREE TREE TREE 4 7 3 9 axiom-tree tip tip TREE fork tip fork TREE 3 3 tip 3 3 3 3 3 fork 3 3 3 3 3 3 3 $rmin $min 4 7 3 9 4 4 3 3 3 3 3 3 3 3 3 7 3 9 $axiom-tree $tree 3 3
Ci-dessous, représentation des dépendances et de la construction du résultat.
Ci-contre, l’arbre d’entrée avec les noms des phyla et des opérateurs ainsi que les valeurs aux feuilles. Un exemple d’arbre binaire d’entier.
h h s h s s Y1 X Y2 Y2 h s h s h s Y1 X
Arbre d’entrée Résultat de la fonction
Point d’insertion clé info
clé info
clé info clé info clé info clé info clé info
clé info nouveau noeud null noeud dupliqué ancien noeud clé info clé info clé info
Algorithme de décision de destructibilité (à partir des durées de vie et
Notre algorithme (chapitre 6) prend en compte
des graphes de dépendance) calculer leur destructibilité.
la durée de vie et le partage des attributs pour
Structure des arguments et des résultats construits
OLGA : typage fort ASX : accès aux productions
FNC-2. Information exacte. Connu à la génération des séquences de visites.
Correspond à un seul attribut synthétisé. (mono-attribut)
Besoins Grammaires Attribuées Programmation Fonctionnelle
Ordre d’évaluation
Durée de vie
Partage mémoire (comptage de référence, alias graph,
analyse de chemins) Interprétation abstraite
Information approchée Typage
Appel à la fonction applicative f.
Application globale (grammaire attribuée)
(réutilisation mémoire)
TRANSFORMATION
fork
fork fork
Espace mémoire réutilisé.
u $a $a
Attributs à partir desquels le résultat doit être construit. Nouvel espace mémoire alloué.
tip tip TRANSFORMATION (aucun effet) u $a u $a fork fork
calcul de {s1,s2}
Dans la version destructive, le calcul de s1 modifie l’arbre d’entrée.
X0 s1 s2
calcul de s1 calcul de s2
modification physique de l’arbre d’entrée
X0 s1 s1
valeur de s2 invalide
s2
calcul de s2 calcul de s1
modification physique de l’arbre d’entrée
a1 est correct, mais b ne l’est plus !
a1
b a
b
L’évaluation de a1 est la dernière utilisation directe de a.
b
a c
a partage les structures de b et de c
C’est un partage dû à sa définition. a := fork (b , c);
a
b c
a partage la structure de b
C’est un partage dû à son utilisation. b := fork (a , c);
D
D
D
D
D
a b c e d f g i h jD
D
D
D
D
... C lisp Grammaire attribuée Front End (olga, asx) Evaluateur Abstrait Destructif (l’ordre de certaines Evaluateurs destructifs Back End Tests de (FNC, DNC, l-ordonnée) Séquences de Visite
Caractérisation Génération des Optimiseur
Transformation Algorithme de Destructive mémoire lisp C ...
est destructif, conformément aux par l’algorithme de transformation. Le code généré par le back end modifications ( let ... in ...) calculées
évaluations peut avoir été précisé) Générateur d’Evaluateurs
Grammaire attribuée Front End (olga, asx) Back End Tests de (FNC, DNC, l-ordonnée) Séquences de Visite
Caractérisation Génération des Optimiseur mémoire Décision de la destructibilité des paramètres Abstrait Evaluateur lisp C ... lisp C ... Evaluateurs faisant éventuellement
des appels à des fonctions de mise à jour destructives
Il référence des appels aux versions destructives ou applicatives du back end
applicatif, l’autre destructif. chaque fonction de mise à jour : l’un Le back end dispose de deux codes pour
(en fonction de la décision). Générateur d’Evaluateurs
) ) ) e f Cons a nil Cons b ( Cons c ( ( Cons d a b c d e f nil e f nil
Cons a ( Cons ( append
nil c d ) ) e f nil e f nil b arbre intermédiaire nil d b a c append Cons a nil d c b append ( ) zs Cons a ( Cons b ) nil c d append ( ) append ( ) a b d c nil niil append ( ) e f nil
Cons a ( Cons b (append nil ) )
nil c d ( ) zs append Cons a ( append ) nil nil b c d append ( ) zs xs ys zs zs et reconstruction jusqu’à ... etc ... jusqu’à ... Cons a ( append b c d nil )
e f nil Cons a ( Cons a ( Cons b ( c d e f ) ) ) ) ) ) b c d e f nil h_1 nil ) h_1 h_1 e f nil ) ) ) ) ) ) h_0 nil h_0 b nil nil a b h_0 xs ys zs ) ) ) ) ) ) nil c d nil c d e f nil e f nil e f nil nil c d nil c d e f nil d nil c ( Cons Cons b ( Cons b ( Cons a ( Cons a ( Cons a ( Cons a ( Cons a ( Cons a ( Cons a ( Cons b ( Cons b ( Cons b ( Cons b ( c ( Cons Cons d ( Cons d ( c ( Cons c ( Cons e f nil d e f nil nil a b c d e f nil
Aucune structure intermédiaire n’a été construite
)
)
construction syntaxique règle de copie i1 i2 u2 : cons u1 : cons u0 : root u3 : nil s s h : nil h : cons h :cons s z : root
construction syntaxique la construction intermédiaire est éliminée règle de copie u0 : root u1 : cons u3 : nil s h z z.z : root u2 : cons s.h : nil s.h h.h : cons h.h : cons h.s h.s h.s h.h s.s s.s s.s s s h h i2 i1 s.h
1 7 3 5 1 7 3 5 n1 n1 n2 n3
flip
n3 n2Arbre d’entrée (TREE) Résultat de la fonction (TREE) Attributs hérités à la racine $do $i $k false false true true false true false $tree nouveau noeud null noeud dupliqué ancien noeud G G G G G G G G H K P F C B E H K F arrayid varid varid varid varid arrayid varid varid varid arrayid varid varid varid
varid varid varid varid
Arbre d’entrée (TREE) Résultat de la fonction (TREE) Attributs hérités à la racine $do $i $k true true false true false ancien noeud nouveau noeud null false false $tree $tree $tree(null) $tree
Modification du champ RIGHT du
F K P H G B E C arrayid varid arrayid varid varid varid varid varid varid varid varid varid varid varid varid G G G G G G G
D
D
Mise à jour applicative Règle de copie
Instance d’attribut destructible Instance d’attribut non-destructible
D ROUTINE_1 STMTS_1 DECLS_2 DECLS_1 DECL_1 $s-temp-st DECL_2 ID_2 ID_1 $s-temp-st $s-temp-st $h-temp-st
$h-temp-st $s-temp-st $h-temp-st DECLS_3 $s-temp-st
$h-temp-st $h-temp-st $symtab D D D D D D D D D D
null BLOC 3
BLOC 2
BLOC 1
insertion destructive possible insertion destructive impossible
$attr PROGRAM BLOCK STMT DECLS DECL ID DECL DECL ID NUMBER BLOCK ID ID ID STMT DECLS DECL ID $s-st $h-st $symtab $h-st $symtab $h-st $symtab $h-st $symtab $h-st $symtab $h-st $symtab $h-st $symtab $s-st $s-st $s-st $s-st $s-st $s-st $symtab $h-st empty-table $symtab $s-st
Mise à jour applicative
$symtab
Attribut destructible
$attr
Atrribut non destructible