AccueilđŸ‡«đŸ‡·Chercher

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.

Attribut synthétisé
Attribut synthétisé

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.

Ordre d'Ă©valuation
Ordre d'Ă©valuation

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

Ordre d'Ă©valuation
Ordre d'Ă©valuation

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.

    Articles connexes

    Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.