Académique Documents
Professionnel Documents
Culture Documents
Grammaires attribues Attributs synthtiss Attributs hrits Arbres syntaxiques Grammaires S-attribues Grammaires L-attribues - schmas de traduction - traduction descendante - traduction ascendante
Objectifs
Faire la traduction pendant l'analyse syntaxique Ajouter des actions portant sur les attributs des symboles Obtenir un module qui fait la fois l'analyse syntaxique et la traduction en une seule passe
Analyse descendante Utiliser des fonctions qui ont des paramtres et renvoient des valeurs : les attributs
Analyse ascendante La mthode est applicable avec Bison
Exemple
Grammaire attribue pour une calculette rgle action L --> E '\n' print(E.val) E --> E + T E.val := E1.val + T.val E --> T E.val := T.val T --> T * F T.val := T1.val * F.val T --> F T.val := F.val F --> ( E ) F.val := E.val F --> chiffre F.val := chiffre.val
Si la rgle comporte plusieurs fois un mme non-terminal Une occurrence avec un indice dans l'action correspond l'occurrence correspondante dans le membre droit de la rgle
Arbres dcors
En ajoutant un arbre de drivation les attributs et leurs valeurs, on obtient un arbre dcor
L
E .val=19 E .val=15 T .val=15 T .val=3 * F .val=3 nombre .val=3 F.val=5 nombre .val=5 F.val=4 nombre .val=4 \n
T .val=4
Grammaires attribues
Une grammaire attribue est dfinie par - une grammaire - des attributs associs chaque symbole terminal ou nonterminal - une action associe chaque rgle X --> expr b := f(c1, c2, ... ck) Une action peut avoir des entres c1, c2, ... ck et des sorties b qui sont des attributs de X et des symboles formant expr
T .val=4
+ . - . .
id id .
num
entre pour c
entre pour a
: cre un noeud dont l'tiquette est l'oprateur op et avec deux champs pour les pointeurs left et right
makeLeaf(id, entree)
: cre un noeud dont l'tiquette est id et avec un champ pour un pointeur vers une entre de la table des symboles : cre un noeud dont l'tiquette est num et avec un champ pour la valeur de la constante
makeLeaf(num, val)
Les deux attributs E.ptr et T.ptr contiennent des pointeurs sur des arbres construits
Grammaires S-attribues
Grammaires dont tous les attributs sont synthtiss Le calcul des attributs peut se faire dans la pile de l'analyseur ascendant
tat valeur
... ...
X X.x
Y Y.y
Z Z.z
Exemple
Donne Pile S --> E $ E --> E + T E --> T T --> T * F T --> F F --> ( E ) F --> N 3*5+4$ *5+4$ N *5+4$ F *5+4$ T 5+4$ T * +4$ T * N Valeurs 3 3 3 33-5 Rgle
F --> N T --> F
+4$ T * F +4$ T
3-5 15
F --> N T --> T * F
Grammaires S-attribues
Calculer les attributs pendant les rductions A --> X Y Z A.a := f(X.x, Y.y, Z.z) Rduction : - calculer A.a en fonction des valeurs contenues dans la pile - dpiler X Y Z - empiler A - sauvegarder A.a dans la pile
X X.x A A.a
Y Y.y
Z Z.z
Exemple
L --> E '\n' E --> E + T E --> T T --> T * F T --> F F --> ( E ) F --> chiffre print(val[top-1]) val[ntop] := val[top - 2] + val[top] /* inutile de recopier */ val[ntop] := val[top - 2] * val[top] val[ntop] := val[top - 1]
val[] : pile des valeurs d'attributs top : taille actuelle de la pile ntop : taille de la pile aprs la rduction en cours (se dduit de top et de la longueur de la rgle)
Grammaires L-attribues
Grammaire dans laquelle le calcul des attributs peut tre fait lors d'un parcours en profondeur de l'arbre de drivation
parcours(noeud n) { pour chaque fils m de n { calculer les attributs hrits de m ; parcours(m) ; } calculer les attributs synthtiss de n ; }
Dfinition formelle
Une grammaire est L-attribue si - tout attribut est synthtis ou hrit ; - dans une rgle A --> X1 X2 ...Xn, si un attribut Xi.b est calcul dans l'action associe, il ne dpend que des attributs des variables X1 X2 ...Xi-1 ou des attributs hrits de A
B --> B sub B
B --> texte
Schmas de traduction
Comme une grammaire attribue mais prcise quand on fait les actions pendant un parcours de l'arbre en profondeur Elles sont insres dans les membres droits des rgles Si une action calcule un attribut d'un non-terminal du membre droit, elle doit tre place avant lui Si une action utilise un attribut d'un non-terminal du membre droit, elle doit tre place aprs lui Exemple : traduction postfixe des expressions additives E --> T R R --> addop T { print(addop.lexeme) } R | T --> num { print(num.val) }
Le langage EQN
S --> { B.cc := 10 } B { S.ht := B.ht } B --> { B1.cc := B.cc } B { B2.cc := B.cc } B { B.ht := max(B1.ht, B2.ht) } B --> { B1.cc := B.cc } B sub { B2.cc := diminue(B.cc) } B { B.ht := position(B1.ht, B2.ht) } B --> texte { B.ht := texte.hn * B.cc } Une grammaire L-attribue peut toujours tre mise sous la forme d'un schma de traduction
Traduction descendante
Pour l'analyse descendante, on limine la rcursivit gauche dans la grammaire Il faut aussi adapter les attributs Exemple E --> E + T E --> E - T E --> T T --> ( E ) T --> chiffre
E.val := E1.val + T.val E.val := E1.val - T.val E.val := T.val T.val := E.val E.val := chiffre.val
E' .he=4
T .val=9 T .val=5 + T .val=2 E' .he=6
nombre .val=9
nombre .val=5
nombre .val=2
Traduction descendante
Donne : un schma de traduction non rcursif gauche Rsultat : le code d'un traducteur descendant Pour chaque non-terminal A, construire une fonction dont les paramtres sont les attributs hrits de A et qui renvoie comme valeur les attributs synthtiss de A (on suppose qu'il n'y en a qu'un) Le code pour A dcide quelle rgle appliquer en fonction du symbole courant dans la donne Pour chaque attribut d'une variable du membre droit, dclarer une variable locale
Traduction descendante
Le code associ une rgle parcourt le membre droit et fait les actions suivantes : - pour un symbole terminal X avec un attribut x, sauvegarder la valeur de x dans une variable locale et lire X - pour un non-terminal B, faire c := B(b1, b2, ... bk) o c est l'attribut synthtis de B et b1, b2, ... bk sont les attributs hrits de B - pour une action, faire l'action
Traduction ascendante
Le problme est de calculer les attributs hrits On effectue les actions seulement au moment o on rduit Dans une rgle A --> X1 X2 ...Xn, au moment o on passe Xi, on a dans la pile X1 X2 ...Xi-1 mais pas A Si un attribut hrit de Xi dpend d'un attribut de A, quand et comment le calculer ? on ira le chercher dans la pile et non dans la rgle La mthode prsente est applicable certaines grammaires L-attribues dont la grammaire sous-jacente est LR(1)
,q,r$ TL
, r $ T L , id ,r$ TL
L --> id
L --> L , id
r$ TL,
$ T L , id $ TL $ D L --> L , id D --> T L
.cc .ht
.hn
Algorithme gnral
Donne : une grammaire L-attribue Rsultat : un traducteur ascendant On suppose que chaque non-terminal A a un attribut hrit A.he et que chaque symbole X a un attribut synthtis X.sy Remplacer chaque rgle A --> X1 X2 ...Xn par A --> M1 X1 M2 X2 ... Mn Xn Associer les Xi.he aux Mi Quand on rduit vers Mi, la position de A.he, X1.he X2.he ... dans la pile se dduit de la nouvelle grammaire
Rsum
Les schmas de traduction permettent d'incorporer la traduction l'analyse syntaxique pour obtenir un traducteur en une passe Les attributs synthtiss sont faciles calculer - analyse descendante : valeurs des fonctions associes aux non-terminaux de la grammaire - analyse ascendante : dans la pile Les attributs hrits sont calculs - en analyse descendante : comme paramtres des fonctions - en analyse ascendante : en remontant dans la pile, et s'il le faut en introduisant des non-terminaux "marqueurs"