Grammaire S-attribuée
Une grammaire S-attribuĂ©e est une grammaire ne contenant que des attributs synthetisĂ©s oĂč chaque attribut ne dĂ©pend que des attributs fils.
Généralités
Un bon compilateur permet de traduire un code source en code objet. Il effectue trois phases d'analyse : l'analyse lexicale, syntaxique et sémantique. La phase d'analyse sémantique permet de calculer tous les attributs en évaluant toutes les conditions de contexte. Ainsi, le but d'une grammaire attribuée participe à produire non pas seulement un code objet valide mais aussi efficace. Les grammaires attribuées sont en fin de compte des grammaires non contextuelles déjà utilisées dans l'analyse syntaxique étendues aux calculs nécessaires pour l'analyse sémantique. Pour cela, deux mécanismes sont mis en place : l'un pour les données et l'autre pour les calculs (définition dirigée par la syntaxe/traduction dirigée par la syntaxe).
- Pour tout symbole grammatical X, terminal ou non terminal, on spĂ©cifie zĂ©ro ou plusieurs attributs : chacun avec un nom et un type. Ce sont des attributs formels et servent Ă conserver les informations relatives Ă S, nĆud d'un arbre abstrait.
- Ă chaque production A â A1...An est associĂ© un ensemble de rĂšgles d'Ă©valuation des attributs qui expriment certains des attributs de la partie gauche A et des membres de la partie droite Ai, en termes de valeurs d'autres, attributs. Ces rĂšgles d'Ă©valuation vĂ©rifient Ă©galement des conditions de contexte et fournissent des messages d'avertissement ou d'erreur (rĂšgles associĂ©es aux productions plutĂŽt qu'aux non-terminaux).
- DĂ©finition d'attribut
Un attribut est une information jugée utile pour le processus de compilation (valeur, types, etc.).
Les attributs de chaque symbole non terminal sont divisés en deux groupes : les attributs synthétisés et les attributs hérités. Notons que la production doit avoir A comme partie gauche.
- Notion d'attribut synthétisé
Un attribut synthĂ©tisĂ© d'un non terminal A Ă un nĆud N d'un arbre d'analyse est dĂ©fini par une rĂšgle sĂ©mantique associĂ©e Ă la production en N.
MĂ©thodes d'Ă©valuation des attributs
Les méthodes d'évaluation des attributs permettent d'associer une action sémantique à tout non-terminal de la grammaire.
MĂ©thode Ă plusieurs passes
- Créer l'arbre syntaxique
- CrĂ©er le graphe de dĂ©pendances dâattributs
- GĂ©nĂ©rer un ordre dâĂ©valuation : tri topologique
MĂ©thode Ă une passe
- Les rĂšgles sĂ©mantiques sont exĂ©cutĂ©es dans un ordre dĂ©crit par la grammaire pendant lâanalyse syntaxique.
- L'utilisateur doit tenir compte de ce fait pour concevoir sa définition dirigée par la syntaxe.
La mĂ©thode Ă une passe essaye de faire coĂŻncider la phase dâanalyse synthĂ©tique avec lâĂ©valuation des attributs. Deux cas de figure se prĂ©sentent : Ă©valuation ascendante (coĂŻncidant avec une analyse LR) et descendante (coĂŻncidant avec une analyse LL).
Ad-hoc
Il s'agit de faire à notre convenance. Si le graphe de dépendances d'attributs contient un cycle, alors nous sommes obligés d'utiliser des méthodes ad-hoc. En général, c'est déconseillé à un compilateur d'avoir un graphe de dépendances d'attributs cyclique.
Traduction dirigée par la syntaxe
Propriété
Une traduction dirigée par la syntaxe qui n'implique que les attributs synthétisés est appelée S-attribuée. Chaque rÚgle calcule un attribut pour le non-terminal en partie gauche de la production à partir de la partie droite de la production.
Exemple
La traduction dirigée par la syntaxe s'appuie sur notre grammaire usuelle des expressions arithmétiques avec les opérateurs + et *. Dans la traduction dirigée par la syntaxe, chacun des non-terminaux a un attribut synthétisé unique appelé val. Nous supposons aussi que le terminal nbr a un attribut synthétisé vallex, à valeur entiÚre rendu par l'analyseur lexical.
Grammaire usuelle des expressions arithmétiques |
---|
L â E |
E â E+T | T |
T â TâF | F |
F â ( E ) | nbr |
Production | RÚgle sémantique |
---|---|
E â T | E.val=T.val |
E â E1+T | E.val=E1.val+T.val |
E â T | E.val=T.val |
T â T1*F | T.val=T1.val*F.val |
T â F | T.val=F.val |
F â E | F.val=E.val |
F â nbr | F.val=nbr.vallex |
- Une rÚgle sémantique est une fonction associée à une production syntaxique permettant de calculer la valeur d'un attribut. Elle est exécutée lorsque la production est effectuée.
- Remarque : Certaines rÚgles sémantiques comportent des effets de bord (cf la premiÚre rÚgle).
Elles ne calculent aucun attribut explicitement, mais gĂ©nĂšrent un rĂ©sultat de traitement (ici affichage Ă l'Ă©cran). Cette DDS S-attribuĂ©e peut ĂȘtre implĂ©mentĂ©e naturellement en relation avec un analyseur LR. Intuitivement, les attributs synthĂ©tisĂ©s sont bien adaptĂ©s aux analyses syntaxiques ascendantes.
Graphe de dépendances
Un graphe de dĂ©pendances est un outil utile pour dĂ©terminer un ordre d'Ă©valuation pour les instances d'attributs dans un arbre d'analyse donnĂ©. Alors qu'un arbre d'analyse dĂ©corĂ© montre la valeur des attributs, un graphe de dĂ©pendances aide Ă dĂ©terminer comment ces valeurs peuvent ĂȘtre calculĂ©es. Les arcs expriment les contraintes impliquĂ©es par les rĂšgles sĂ©mantiques. PrĂ©cisĂ©ment :
- Pour tout arbre d'analyse, pour tout nĆud Ă©tiquetĂ© par le symbole X, le graphe de dĂ©pendance a un nĆud pour chaque attribut associĂ© Ă X.
- Ă chaque nĆud N Ă©tiquetĂ© A de production p, on crĂ©e un arc vers l'attribut b de N depuis l'attribut C du fils de N correspondant Ă l'instance du symbole X dans la partie droite de la production.
Ordre d'Ă©valuation des attributs
Lorsque la traduction dirigĂ©e par la syntaxe est S-attribuĂ©e, on peut Ă©valuer ses attributs dans n'importe quel ordre ascendant des nĆuds de l'arbre d'analyse. Il est souvent trĂšs simple d'Ă©valuer les attributs en effectuant un parcours postfixe de l'arbre d'analyse. S'il y a un circuit dans le graphe, il n'existe pas de tri topologique : il n'y a donc aucun moyen d'Ă©valuer les nĆuds avec cet arbre d'analyse.
Une analyse syntaxique ascendante
Une traduction dirigĂ©e par la syntaxe S-attribuĂ©e peut ĂȘtre implĂ©mentĂ©e au cours d'une analyse ascendante, puisqu'une analyse ascendante correspond Ă un parcours postfixe. PrĂ©cisĂ©ment : si la grammaire sous-jacente est LR, elle peut ĂȘtre implĂ©mentĂ©e sur la pile d'analyse LR.
Ăquivalence entre grammaire S-attribuĂ©e et grammaire L-attribuĂ©e
- Quel type de grammaire choisir
Pour utiliser yacc efficacement, il serait plus intéressant de construire une grammaire S-attribuée afin de calculer les attributs en une seule passe. Supposons que vous avez une grammaire L-attribuée, et vous voulez utiliser yacc
- Transformation dâune grammaire L-attribuĂ©e vers S-attribuĂ©e
Considérations pratiques
Les grammaires S-attribuées sont propres mais ne sont pas toujours efficaces
- NĂ©cessite beaucoup de copies dâattributs : redondance dâinformation, consommation dâespace mĂ©moire
- RĂ©sultats propagĂ©s vers la racine dâun arbre syntaxique dĂ©corĂ© (thĂ©oriquement!)
Notes et références
- Cours ISTY 2 Sid TOUATI (Cours de compilation)
- Compilateurs : Principes, techniques et outils. A. Aho, R. Sethi et J. Ullman. InterEditions.
- Compilateurs. D. Grune, H.E. Bal, G. J.H. Jacobs, K.G. Langendoen. Editions Dunod.
- Lex & yacc. John R. Levine, Tony Mason et Doug Brown. Edition OâReilly.