• Aucun résultat trouvé

SAOUDI Lalia Traduction dirigée par la syntaxe 2007/2008

N/A
N/A
Protected

Academic year: 2022

Partager "SAOUDI Lalia Traduction dirigée par la syntaxe 2007/2008"

Copied!
11
0
0

Texte intégral

(1)

1. Généralités :

Comme son nom l’indique, la traduction dirigée s’élabore en parallèle avec l’analyse syntaxique et plus exactement c’est l’analyse syntaxique qui oriente la traduction.

Pour traduire une construction d’un langage de programmation, un compilateur peut avoir besoin de garder trace de nombreuses informations, par conséquent, on parlera, de manière abstraite, d’attributs associés à la construction, les valeurs de ces attributs sont calculées par des règles sémantiques associées aux productions de la grammaire.

Il existe deux notations pour associer des règles sémantiques aux productions : les définitions dirigés pas la syntaxe et les schémas de traduction

2. Définition Une définition dirigée par la syntaxe utilise une grammaire non contextuelle

pour spécifier la structure syntaxique du texte d'entrée. A chaque symbole de la grammaire, on associe un ensemble d'attributs et, à chaque production, un ensemble de règles sémantiques pour calculer la valeur des attributs associés aux symboles apparaissant dans cette production.

La grammaire et l'ensemble des règles sémantiques constituent la définition dirigée par la syntaxe.

On notera X.l l’attribut d’étiquette l associé au symbole X .

S'il y a plusieurs symboles X dans une production, on les noteraX

1

,X

2

,….X

n

, et X

(0)

s'il est en partie gauche.

3.Structure d’une définition dirigée par la syntaxe :

Dans une DDS chaque production AB de la grammaire possède un ensemble de règles sémantiques de la forme b :=f(c1,c2….ck) où f est une fonction et/

1- Soit b est un attribut synthétisé de A.

2- Soit b est un attribut hérité d’un des symboles en partie droite de la production.

Et c1,c2….ck sont des attributs de symboles quelconques de la production, dans les deux cas on dit que b dépend de c1,c2….ck.

Les terminaux devraient ne posséder que des attributs synthétisés, la valeur des attributs des terminaux est fournie par l’analyseur lexical

Exemple : soit la DDS d’un programme de calculatrice de bureau

Productions Règles sémantiques

L E n EE1+T ET TT*F TF F( E ) Fchiffre

Imprimer (e.val) E.val := E1.val + T.val E.val :=T.val T.val :=T1.val* F.val T.val := F.val F .val := E.val F.val := chiffre.vallex

DDS d’une calculatrice de bureau

La règle associée à la production LEn définissant l’axiome L, est un appel de procédure qui imprime la valeur engendrée par E, cette règle peut être considérée comme définissant un attribut factice du non-terminal L

3.1 Attributs synthétisés : Un attribut est synthétisé si sa valeur, à un nœud d'un arbre syntaxique, est déterminée à partir de valeurs d'attributs des fils de ce nœud. Les attributs synthétisés sont utilisés intensivement en pratique. Une définition dirigée par la syntaxe qui utilise uniquement des attributs synthétisés est appelée une définition S-attribuée.

(2)

Les attributs synthétisés ont la propriété de pouvoir être évalués au cours d'un simple parcours ascendant de l'arbre syntaxique. Un arbre syntaxique pour une définition S-attribuée peut

toujours

être décoré en évaluant les règles sémantiques pour les attributs de chaque nœud du bas vers le haut, des feuilles vers la racine

Exemple 2(Attributs synthétisés) : soit la définition S-attribuée présenté dans l’exemple 1 :

La figure suivante présente un arbre décoré pour la chaine d’entrée 3*5+4n(n caractère de fin de ligne)

L

E.val=19 n

E.val=15 T.val=4

T.val=15 F.val=4

T.val=3 * F.val=5 chiffre.vallex=4

F.val=3 chiffre.vallex=5

chiffre.vallex=3

Arbre syntaxique décoré pour 3*5+4n 3.2 Attributs hérités

Un attribut est hérité si sa valeur, à un nœud d'un arbre syntaxique, est déterminée à partir de valeurs d'attributs du père et/ou des frères de ce nœud. Bien qu'il soit toujours possible de réécrire une définition dirigée par la syntaxe de façon à n'utiliser que des attributs synthétisés, il est souvent plus naturel d'utiliser des définitions avec attributs hérités.

Exemple 3 ( Attributs hérités) : un exemple d’attribut hérité est la déclaration d’identificateurs typés.

On veut reconnaitre les expressions type x1,x2………xn avec type un non-terminal

correspondant à int ou real et déclarer les identificateurs du bon type dans la table des symboles par l’action add( x,type, T) qui ajoute le type de chaque identificateur à son entrée dans la table des symboles

D T L L.typh := T.typ

Tint T.typ := int

T real T.typ := real

LL1 ,id L1.typh:=L.typh ; add( id.entrée, L.typh) Lid add (id.entrée, L.typh)

DDS avec l’attribut hérité L.typh D

T.typ=real L.typh= real

Real L.typh=real , id1

id2

Arbre syntaxique avec un attribut hérité typh à chaque nœud étiqueté L

(3)

4. Graphes de dépendances :

Si un attribut b à un nœud d’un arbre syntaxique dépend d’un attribut c, la règle sémantique définissant b en ce nœud doit être évaluée après la règle sémantique qui définit c.

les interdépendances entre les attributs hérités et synthétisés aux nœuds d’un arbre syntaxique peuvent être décrites par un graphe orienté appelé graphe de dépendances.

En introduisant un attribut factice b pour toute règle sémantique qui consiste en appel de procédure.

Le graphe a un sommet pour chaque attribut

Il ya un arc du sommet correspondant à c au sommet correspondant à b si l’attribut b dépend de c Dans le cas des attributs synthétisés les arrêtes sont dirigées des fils vers le père

Dans le cas des attributs hérités on peut avoir une arête du père vers le fils ou d’un frère à un autre.

Plus précisément, le graphe de dépendance pour un arbre syntaxique donné est construit de la façon suivante :

Pour chaque nœud n de l’arbre syntaxique faire

Pour chaque attribut a du symbole de la grammaire étiquetant n faire Construire un sommet dans le graphe de dépendance pour a ; Pour chaque nœud n de l’arbre syntaxique faire

Pour chaque règle sémantique b := f( c1,c2…,ck) associée à la production appliquée en n faire Pour i :=1 à K faire

Construire un arc du sommet correspondant à ci au sommet correspondant à b ; Exemple 4 :

Production règle sémantique E E1 + E2 E.val= E1.val + E2.val

E ●val

E1 ●val + E2 ●val

Les lignes pointillées représentent l’arbre syntaxique et ne font pas partie du graphe de dépendance Exemple5 :voici le graphe de dépendances pour l’arbre syntaxique de l’exemple 3 :

Chacune des procédures add (id.entrée, L.typh) associées aux productions définissant L conduit à la création d’un attribut factice

Remarque : si le graphe de dépendance contient un cycle, l'évaluation des attributs est alors impossible L’évaluation de ces règles sémantiques stocke le type real dans l’entrée de chaque identificateur dans la table des symboles.

Plusieurs méthodes ont été proposées pour évaluer les règles sémantiques :

(4)

Méthodes fondées sur l’arbre syntaxique :-déterminent un ordre d’évaluation à partir d’un tri topologique du graphe de dépendance construit d’après l’arbre syntaxique, ceci pour chaque texte d’entrée.

-Echec dans le cas d’un graphe cyclique.

Méthodes fondées sur les règles sémantiques : -au moment de la construction du compilateur, on analyse les règles sémantiques associées aux productions, soit à la main soit par un outil spécialisé -pour chaque production, l’ordre d’évaluation des attributs associés est pré calculé et sera utilisé au moment de l’évaluation.

Méthode à ordre fixe : -choix d’un ordre d’évaluation sans tenir compte des règles sémantiques, l’ordre d’évaluation est imposé par la méthode d’analyse.

Les deux dernières méthodes ne font pas appel à un graphe de dépendance : efficacité en temps et en mémoire.

5. Evaluation ascendante des définitions S-attribuées

Maintenant nous pouvons commencer à étudier comment implanter des traducteurs à partir de ces définitions, les attributs synthétisés peuvent être évalués par un analyseur syntaxique ascendant au fur et à mesure que le texte d’entrée est lu.

Une définition syntaxique est dite S-attribuée si elle ne comporte que des attributs synthétisés.

Un traducteur pour une définition S-attribuée peut souvent être implantée à l’aide d’un constructeur d’analyseur syntaxique LR.

Un analyseur syntaxique ascendant utilise une pile pour garder de l’information sur les sous arbres qui ont été reconnus. Nous pouvons ajouter des champs à la pile d’analyse pour stocker les valeurs des attributs synthétisés.

(5)

Les attributs synthétisés de cet arbre peuvent être évalués par un analyseur syntaxique LR au cours de l’analyse ascendante de la phrase 3*5+4n

Flot d’entrée Etat Val Productions utilisées Fragment de code

3 *5+4

*5+4

*5+4

*5+4 5+4 +4 +4 +4 +4 4 N N N

3 F T T*

T*5 T*F T E E+

E+4 E+F E+ T

3 3 3 3 3 – 5 3 – 5 15 15 15 15 – 4 15 – 4 15 – 4

F id T F

F id TT*F ET

F id TF

Val[future-sommet]:=val[s-2]*val[s]

(6)

N E 19 EE+T Val[future-sommet]:=val[s-2]+val[s]

6. Evaluation L-attribuées :

Nous présentons maintenant une classe de définitions dirigées par la syntaxe, appelées L-attribuées, dont les attributs peuvent toujours être évalués en profondeur ( L est l’abréviation de Left car l’information véhiculée par les attributs semble se propager de gauche à droite)

Définitions L-attribuées :

Une DDS est L-attribuée si tout attribut hérité de Xj, 1<= j<=n, de la partie droite de la production AX1X2………..Xn, ne dépend que :

1-des attributs des symboles X1,X2….,Xj-1 situés à gauche de Xj dans la production et 2-des attributs hérités de A.

Notons que toute définition S-attribuée est L-attribuée car les restrictions 1 et 2 ci-dessus ne concernent que les attributs hérités.

Exemple :

La DDS de la figure suivante n’est pas L-attribuées :

Productions règles sémantiques Productions règles sémantiques

A LM L.h := l(A.h) AQR R.h:=r(A.h)

M.h := m(L.s) Q.h :=q(R.s)

A.s :=f(M.s) A.s := f(Q.s)

(7)
(8)
(9)

7. Schéma de traduction

Un schéma de traduction est une grammaire non contextuelle dans laquelle des attributs sont associées aux symboles de la grammaire, et des actions sémantiques, délimitées par des accolades {}, sont insérées dans les parties droites des productions.

Exemple :

S'  {nba :=0} S S  a { nba ++} S Dans un STDS si on a : S  αX { une action } Y β

L’action est exécutée après que le sous_arbre syntaxique issu de X aura été parcouru (par un parcours en profondeur) et avant que celui issu d Y ne le soit.

Quand on conçoit un schéma de traduction, il faut respecter un certain nombre de restrictions qui assurent que la valeur d’un attribut est bien disponible quand un action s’y réfère .

Le cas le plus simple se produit quand on ne manipule que les attributs synthétisés. Dans ce cas on peut construire le schéma de traduction en créant une action formée d’une affectation par règle sémantique et en plaçant cette action à la fin de la partie droite de la production :

Exemple :

T T

1

* F { T.val := T1.val x F.val}

Si l’on a à la fois des attributs hérités et des attributs synthétisés, il faut être plus prudent : 1- Un attribut hérité d’un symbole en partie droite d’une production doit être calculé dans

une action situé avant ce symbole.

2- Une action ne doit pas faire référence à un attribut synthétisé d’un symbole situé à droite de l’action.

3- Un attribut synthétisé du non-terminal en partie gauche ne peut être calculé qu’après que tous les attributs dont il dépend ont été calculés. L’action calculant de tels attributs peut en général être placé à la fin de la production.

Le schéma de traduction suivant, ne remplit pas la première condition :

(10)

S A

1

A

2

{ A

1

.h :=1 ; A

2

.h := 2}

A a { Imprimer ( A.h)},

En effet, nous pouvons constater que l’attribut hérité A.h de la seconde production n’est pas défini quand on tente d’imprimer sa valeur au cours d’un parcours en profondeur de l’arbre syntaxique de la chaine aa .( pourquoi ?)

Si l’action définissant les valeurs de A1.h et A2.h est intercalées avant les A dans la partie droite de S AA, plutôt qu’après , alors A.h aura bien une valeur chaque fois Imprimer( A.h) sera exécuté

8. Traduction dissociée de l’analyse syntaxique :

La traduction dirigée par la syntaxe peut se fonder sur des arbres abstraits aussi bien que des arbres syntaxiques, dans les deux cas on attache des attributs aux nœuds de l’arbre.

Utiliser des arbres abstraits comme représentation intermédiaire permet de dissocier la traduction de l’analyse syntaxique.

Arbre abstrait : un arbre abstrait est une forme condensée d’arbre syntaxique adaptée à la représentation des constructions d’un langage .

La production : I si B alors I1 sinon I2peut apparaitre dans un arbre abstrait sous la forme

Exemple : + Si-alors-sinon

* 4 B L1 L2

3 5

Dans un arbre abstrait, les opérateurs et les mots clés n’apparaissent pas comme des feuilles , mais plutôt associés au nœud intérieur qui serait le père de ces feuilles dans l’arbre syntaxique.

La traduction dirigée par la syntaxe peut se fonder sur des arbres abstraits de la meme façon que sur des arbres syntaxique.

Construction d’arbres abstraits pour les expressions :

La construction d’un arbre abstrait pour une expression est semblable à la traduction de

l’expression en forme post fixée. on construit des sous arbres pour les sous expressions en créant un nœud pour chaque opérateur et chaque opérande. Les fils d’un nœud opérateur sont les racines des sous arbres représentant les sous expressions constituant les opérandes de cet opérateur.

Chaque nœud d’un arbre peut être implanté sous forme d’une structure à plusieurs champs. Dans le nœud correspondant à un opérateur , un champ identifie l’opérateur, les autres contiennent des

pointeurs vers les nœuds correspondant aux opérandes.les nœuds peuvent avoir des champs supplémentaires pour stocker les valeurs ou des pointeurs vers les valeurs des attributs qui leur sont attachés.

On utilisera les fonctions suivantes pour créer les nœuds des arbres abstraits pour des expressions avec des opérateurs binaires :

1.CréerNoeud(op,gauche,droite) :crée un nœud opérateur d’étiquette op avec deux champs contenant des pointeurs vers gauche et droit.

2. CréerFeuille(id, entrée) : crée un nœud identificateur d’étiquette id avec un champ contenant entrée, un pointeur vers l’entrée de id dans la table des symboles

3. CréerFeuille(nb,val) : crée un nœud nombre avec un champ contenant val , la valeur du nombre.

Exemple :la séquence d’appels de fonctions ci-dessous crée l’arbre abstrait de la figure ci-dessous, représentatnt l’expression : a-4+c :

1.P1 := créeFeuille(id,a) ; 4. P4 := créeFeuille(id,c) ;

(11)

Une définition dirigée par la syntaxe pour construire des arbres abstraits :

La figure ci-dessous contient une définition S-attribuée exprimant la construction d’un arbre abstrait pour une expression contenant les opérateurs + et -.

Production règle sémantique

EE1+T E.pnoeud := créeNoeud(+,E1.pnoeud,T.pnoeud) EE1- T E.pnoeud := créeNoeud(-,E1.pnoeud,T.pnoeud)

E T E.pnoeud := T.pnoeud

T(E) T.pnoeud :=E.pnoeud

Tid T.pnoeud := CréerFeuille(id,id.entrée) Tnb T.pnoeud :=CréerFeuille(nb, nb.val) Exemple : construire l’arbre abstrait pour l’expression a-4+c

Références

Documents relatifs

Combiner les deux fonctions définies précédemment, et écrire une fonction slideRowLeft, prenant en argument une liste de longueur boardSize, et retournant une nouvelle liste, où

Combiner les deux fonctions définies précédemment, et écrire une fonction slideRowLeft, prenant en argument un tableau de longueur boardSize, et retournant un nouveau tableau, où

On avait indiqué (Partie II.3.) que lorsque la fonction f ′′ est positive sur I, la fonction f est convexe sur I et inversement quand f ′′ est négative, f est concave.. Dans

• Si la dérivée seconde f ′′ s’annule en changeant de signe en a cela signifie que la fonction change

L’étape principale consiste à prendre un groupe d’états par exemple A= {e1,e2…ek} et un symbole a, et à étudier les transitions des états de A sur a, si ces

Il y a deux réductions pour la case M[A, c], donc ce n’est pas une grammaire LL(1) On ne peut pas utiliser cette méthode d ‘analyse, pour pouvoir choisir entre la production A

Dans l’équivalence structurelle des expressions de type, ou bien les deux expressions sont le même type de base, ou bien elles sont formées en appliquant le même constructeur à

Près de 35 000 employés travaillent pour le 1 er groupe automobile mondial qui fabrique au Japon, environ 2 millions des 9 millions de véhicules vendus en 2007.. Si le groupe