Vous êtes sur la page 1sur 32

Analyse syntaxique

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Introduction
Les grammaires hors-contexte sont les outils que nous utiliserons pour spcier la struce ture syntaxique des programmes. Les grammaires hors-contexte ont plusieurs avantages: Ils constituent une spcication prcise et claire de la syntaxe des programmes. e e On peut construire un analyseur syntaxique ecace directement ` partir de cera taines classes de grammaires. Ore un cadre pour la dnition de traducteurs orients-syntaxe. e e Une dnition et une implantation bases sur une grammaire hors-contexte rene e dent les modications ultrieures du compilateur plus facile. e Cette portion du cours se concentre sur limplantation ` la main danalyseurs syntaxiques a et se rend jusqu` la dnition des grammaires LL(1). a e

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Role et types danalyseurs syntaxiques


programme source analyseur lexical  prochain Q k Q Q Q Q s Q jeton reste de la reprsentation arbre de e syntaxique drivation partie frontale intermdiaire e e 3      +  table des symboles Il y trois grands types danalyseurs syntaxiques: Les mthodes universelles: CYK, Earley. e Les mthodes descendantes: descente rcursive, bases sur les grammaires LL(k). e e e Les mthodes ascendantes: bases sur les grammaires LR(k). e e analyseur

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Gestion et signalement des erreurs


Rappelons quon peut classer les erreurs en ces catgories: lexicales, syntaxiques, smantiques et logiques. e e Etant donn que peu derreurs peuvent tre dtectes au niveau lexical, lanalyseur syntaxique dtecte la plupart des e e e e e erreurs des deux premi`res catgories. e e Objectifs du gestionnaire derreurs: Les erreurs doivent tre signales clairement (messages) et prcisment (causes et coordonnes). e e e e e Il devrait y avoir rcupration apr`s une erreur an de continuer la compilation et la dtection derreurs pour e e e e le reste du programme. La gestion des erreurs ne devrait pas ralentir la compilation des programmes corrects de faon importante. c Lanalyseur syntaxique peut tenter de rcuprer apr`s une erreur de diverses faons: e e e c Mode panique: abandon des jetons jusqu` un jeton dit de synchronisation (certains dlimiteurs ou mots cls). a e e Correction locale: modication dun prxe court de lentre pour permettre ` lanalyse de se poursuivre. e e a Productions derreurs: utilisation de productions derreur qui captent certaines erreurs et fournissent une raction adquate. e e Correction globale: calcul dune plus petite distance ddition qui transforme le programme erron en un e e programme syntaxiquement valide.

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Conventions de notation
Pour minimiser le verbiage inutile, on adopte plusieurs conventions lies ` la notation. e a 1. Les choses suivantes sont des terminaux: des lettres minuscules du dbut de lalphabet comme a, b, c; e des oprateurs comme +, ; e des signes de ponctuation; les chires 0, . . . , 9; des noms en gras comme id, if. 2. Les choses suivantes sont des non-terminaux: des lettres majuscules du dbut de lalphabet comme A, B, C; e la lettre S qui est souvent le symbole de dpart; e des noms en minuscules et en italique comme expr, stmt. 3. Les lettres majuscules de la n de lalphabet, comme X, Y et Z, reprsentent des symboles de la grammaire; cest-`-dire, des e a terminaux et non-terminaux indiremment. e 4. Les lettres minuscules de la n de lalphabet, comme u, . . . , z, reprsentent des cha e nes faites de terminaux. 5. Les lettres grecques minuscules, comme , et , reprsentent des cha e nes faites de symboles de la grammaire. Par ex., A est la forme gnrale dune production o` A et sont les membres gauche et droit, respectivement. e e u 6. Si on a les productions A 1 , . . . , A k , appeles A-productions, on peut crire A 1 | . . . | k et appeler les i les e e alternatives pour A. ` 7. A moins dindications contraires, le membre gauche de la premi`re production est le symbole de dpart. e e

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Dnitions e
Une phrase est une suite de terminaux (synonyme dune cha ne). Une forme de phrase est une suite de terminaux et de non-terminaux. Une forme de phrase est drivable en une forme de phrase , quon dnote par , si = A, = et que A est une e e production. On dit aussi que 1 est drivable en n , quon dnote par 1 n , si 1 2 . . . n et n 1. Si n > 1, on peut crire e e e 1 + n . On a une drivation de E en w si E w. e Une cha w est gnre par la grammaire si S w o` S est le symbole de dpart. ne e ee u e Le langage gnr par une grammaire G, dnot L(G), est lensemble des cha e ee e e nes gnres par G. e ee Un langage L est hors-contexte sil existe une grammaire G dont le langage est L. Deux grammaires sont quivalentes si elles gn`rent le mme langage. e e e e On dit que est drivable ` gauche(droite) dabord en , quon note lm ( rm , respectivement), si = wA, = w et e a A est une production ( = Aw et = w, respectivement). On a une drivation ` gauche(droite) dabord de w, S lm w (S rm w, respectivement), si chaque tape de la drivation se fait ` e a e e a gauche(droite) dabord. Un arbre de drivation dune cha w . . . e ne Une grammaire est ambigu sil existe plus dun arbre de drivation (ou plus dune drivation ` gauche(droite) dabord) pour un certain w. e e e a

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Grammaires H-C versus expressions rguli`res e e


On sait que pour toute expression rguli`re, on peut crer une grammaire hors-contexte e e e qui gn`re le mme langage. e e e Donc, pourquoi tient-on ` utiliser les expressions rguli`res pour dnir la structure a e e e lexicale des langages de programmation? La structure lexicale des langages est habituellement tr`s simple et ne ncessite e e pas lusage des grammaires hors-contexte. Les expressions rguli`res sont plus compactes et plus claires. e e On peut produire des analyseurs lexicaux plus ecaces ` partir dexpressions a rguli`res qu` partir de grammaires. e e a La sparation en structure lexicale et structure syntaxique aide ` modulariser le e a compilateur.

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Vrication du langage gnr e e ee


Le crateur dun langage de programmation doit sassurer que le langage gnr par la e e ee grammaire quil emploie gn`re bien le bon langage. e e Le degr de formalisme dans la vrication peut varier. e e Aussi, il est rarement ncessaire de vrier lensemble de la grammaire dun coup. e e Pour montrer quune grammaire gn`re le bon langage, il faut montrer que toutes les e e cha nes appartenant au langage et seulement celles-ci sont gnres par la grammaire. e ee ` A titre dexemple, le manuel prsente lexemple 4.7 o` on dmontre que le langage des e u e cha nes dans {(, )} qui sont bien parenthses est gnr par la grammaire: ee e ee S (S)S |

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Elimination de lambigu e t
La grammaire dcrivant un langage doit tre conue pour tre sans ambigu e ou bien e e c e t doit tre convertie de faon ` ce quelle ne comporte plus dambigu e. e c a t Par exemple, la grammaire synthtique suivante gn`re des noncs mais elle est ame e e e e bigu: e stmt | | if expr then stmt if expr then stmt else stmt other

Toutefois, on peut la modier par la grammaire quivalente suivante, laquelle nest pas e ambigu: e stmt matched stmt unmatched stmt | | | matched stmt unmatched stmt if expr then matched stmt else matched stmt other if expr then stmt if expr then matched stmt else unmatched stmt
Compilation et interprtation e c Danny Dub 2006 e

IFT-15752

Elimination de la rcursion ` gauche e a


Considrons la grammaire rcursive ` gauche suivante: e e a A A |

o` ne commence pas par A. On peut liminer la rcursion ` gauche en remarquant que A ne peut mener qu` des u e e a a formes de phrases du genre . Ainsi, la grammaire suivante gn`re le mme langage mais sans utiliser la rcursion e e e e ` gauche. a A A A A |

Exemple 4.8 On peut liminer la rcursion ` gauche de la grammaire suivante: e e a E T F E+T |T T F |F (E) | id

en la transformant en la grammaire suivante: E E T T F TE +T E | FT F T | (E) | id

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Elimination de la rcursion ` gauche e a


La technique dlimination de la rcursion ` gauche fonctionne peu importe le nombre e e a ` de A-productions. A titre dexemple, les A-productions suivantes peuvent se grouper en celles qui commencent avec A et celles qui ne commencent pas avec A: A A1 | . . . | Am | 1 | . . . n

On peut alors transformer la grammaire en une grammaire sans rcursion ` gauche: e a A A 1 A | . . . | n A 1 A | . . . | m A |

Ce genre de transformation limine les rcursions ` gauche directes. Certains none e a terminaux peuvent tre rcursifs ` gauche indirectement. Par exemple, dans la grame e a maire suivante, S est rcursif ` gauche: e a S A Aa | b Ac | Sd |

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Elimination de la rcursion ` gauche e a


Lalgorithme suivant limine toute rcursion ` gauche dune grammaire, mme indirecte. Il fonctionne en autant quil ny ait e e a e + pas de cycles, cest-`-dire quil y nait pas un A tel que A A. a Algorithme 4.1 Entre: Une grammaire G sans cycles ni -productions. e Sortie: Une grammaire quivalente sans rcursion ` gauche. e e a Mthode: e 1. Ordonner les non-terminaux par indices A1 , . . . , An . 2. Pour i := 1 ` n faire a Pour j := 1 ` i 1 faire a Remplacer chaque production de la forme Ai Aj par les productions Ai 1 | . . . | k , o` Aj 1 | . . . | k sont les Aj -productions actuelles u Fin Eliminer les rcursions immdiates ` gauche des Ai -productions e e a Fin Exemple 4.9 Eliminer la rcursion ` gauche de la grammaire: e a S A Aa | b Ac | Sd |

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Factorisation ` gauche a
Dans une grammaire comme la suivante: stmt | if expr then stmt else stmt if expr then stmt

on ne peut choisir d`s le dpart laquelle des productions il faut utiliser. Toutefois, en e e mettant en commun les 4 premiers symboles on retarde la prise de dcision jusquau e point o` on dispose des informations ncessaires: u e stmt stmt if expr then stmt stmt else stmt |

Plus gnralement, on peut remplacer les productions: e e A par: A A


IFT-15752

1 | 2

A 1 | 2
Compilation et interprtation e c Danny Dub 2006 e

Factorisation ` gauche a
Algorithme 4.2 Entre: Une grammaire G. e Sortie: Une grammaire quivalente factorise ` gauche. e e a Mthode: e 1. Pour chaque non-terminal A, trouver le plus long prxe commun ` au moins deux Ae a productions. 2. Si = , remplacer: A 1 | . . . | n | 1 | . . . | m

par (o` A est un nouveau non-terminal): u A A A | 1 | . . . | m 1 | . . . | n

3. Rpter jusqu` ce quil ny ait plus de non-terminal pour lequel il existe un prxe commun e e a e non-trivial. Exemple 4.10
IFT-15752 Compilation et interprtation e c Danny Dub 2006 e

Langages non hors-contexte


Les langages suivants ne sont pas hors-contexte: L1 = {wcw | w {a, b} } L2 = {an bm cn dm | n 1 et m 1} L3 = {an bn cn | n 0} Pourtant, ils ressemblent beaucoup aux langages suivants qui, eux, sont hors-contexte: L1 = {wcwR | w {a, b}} L2 = {an bm cm dn | n 1 et m 1} L3 = {an bn | n 0}
IFT-15752 Compilation et interprtation e c Danny Dub 2006 e

Analyse syntaxique descendante


Section 4.4 Contenu: Analyse syntaxique descendante. Analyse syntaxique descendante sans rebroussement (backtracking ) ou analyse prdictive. e La classe des grammaires LL(1). Analyseurs prdictifs sans rcursion. e e

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Analyse syntaxique descendante


Lanalyse syntaxique descendante peut tre vue comme tant: e e une tentative de trouver une drivation ` gauche dabord pour la cha dentre; e a ne e ou une tentative de construire un arbre de drivation pour la cha dentre en e ne e construisant les noeuds de larbre en pr-ordre. e En r`gle gnrale, lanalyse syntaxique descendante demande de faire du rebroussement. e e e Ce nest pas souhaitable en compilation car, pour certaines grammaires, lanalyse peut prendre un temps exponentiel en pire cas. Exemple 4.14 Simulons lanalyse descendante de la cha w = cad en considrant la grammaire: ne e S A cAd ab | a

Ncessite un rebroussement! e
IFT-15752 Compilation et interprtation e c Danny Dub 2006 e

Analyseurs prdictifs e
Dans certains cas, en concevant bien notre grammaire, en liminant les ambigu es et les e t rcursions ` gauche, on obtient un analyseur syntaxique descendant qui na pas besoin e a deectuer de rebroussement, cest-`-dire un analyseur prdictif. a e Pour obtenir un analyseur prdictif, il faut respecter la condition stipulant que: e pour tout non-terminal A ` substituer, a pour tout terminal a qui doit tre consomm sur lentre, e e e il doit y avoir au plus une alternative parmi A 1 | . . . | n qui est capable de gnrer une cha commenant par a. e e ne c Par exemple, en ce qui concerne le non-terminal stmt dans la grammaire suivante, la condition est respecte: e stmt | | if expr then stmt else stmt while expr do stmt begin stmt list end

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Diagrammes de transition
On peut dcrire le comportement dun analyseur prdictif ` laide de diagrammes de transition. e e a Les diagrammes de transition pour lanalyse syntaxique di`rent lg`rement des diagrammes pour e e e lanalyse lexicale: Les diagrammes sont associs aux non-terminaux et il y a un seul diagramme par non-terminal. e Les tiquettes sur les transitions peuvent aussi tre des non-terminaux. e e Une transition sur un terminal correspond ` la consommation du terminal sur lentre. a e Une transition sur un non-terminal correspond ` appeler la procdure danalyse associe au a e e non-terminal. On construit un diagramme de transition pour un non-terminal A ainsi: 1. Crer un tat de dpart et un tat nal. e e e e 2. Pour chaque production A X1 . . . Xn , ajouter un chemin dont les tiquettes sont X1 , . . . , e Xn (ou ajouter une transition tiquete avec si la production est A ). e e

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Diagrammes de transition
Lanalyseur prdictif eectue son travail en se frayant un chemin ` travers un diagramme e a de ltat de dpart ` ltat nal en faisant un certain nombre de transitions: e e a e en passant dun tat s ` un tat t par un arc tiquet a pourvu que le prochain e a e e e symbole en entre soit a; e en passant dun tat s ` un tat t par un arc tiquet A en appelant la procdure e a e e e e associe ` A; tout symbole de lentre qui est consomm lest au cours de lappel ` e a e e a la procdure; au retour de lappel, on consid`re que le symbole A a t consomm; e e ee e en passant dun tat s ` un tat t par un arc tiquet e a e e e symbole de lentre. e sans consommer de

Aux tats o` lanalyseur prdictif doit choisir parmi plusieurs options, il faut prvoir une e u e e mthode de prise de dcision. e e

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Diagrammes de transition
Voici les diagrammes de transitions correspondant ` la grammaire suivante: a E E T T F TE +T E | FT F T | (E) | id E: E: n T- 1 E- 2 n k n 0 n +- 4 n T- 5 E- 6 n k n 3  T: n F- 8 T - 9 n k n 7 6

n n n k n T : 10 - 11 F - 12 T - 13  6 6

n ( - 15 E - 16 n n ) - 17 k n F : 14 
IFT-15752

id

Compilation et interprtation e

c Danny Dub 2006 e

Diagrammes de transition
Simplication de diagrammes:  ? n +- 4 n T- 5 n 3  k n - 6  T ? n +- 4 n 3  - 6 k n

E:

E:

E:

 T ? n T- 3 n +- 4 n 0  k n - 6

E:

 + ? n T- 3 n 0  - 6 k n

Diagrammes simplis (20-25% plus rapides): e  + ? n T- 3 n 0  ? n F- 8 n 7

E:

- 6 k n

T:

- 13 k n

n ( - 15 E - 16 n n ) - 17 k n F : 14 
IFT-15752

id

Compilation et interprtation e

c Danny Dub 2006 e

Analyse prdictive sans rcursion e e


Entre e a + b 6 Pile X Y Z $ Programme de lAS prdictif e ? Table danalyse syntaxique M - Sortie $

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Analyse prdictive sans rcursion e e


Lanalyseur syntaxique prdictif: e comporte un tampon dentre, initialis avec la cha dentre suivie du symbole $; e e ne e comporte une pile, initialise avec le symbole de dpart par-dessus le symbole $; e e utilise une table danalyse M , o` M [A, a] indique quelle production utiliser si le symbole sur u le dessus de la pile est A et que le prochain symbole en entre est a. e Dans une conguration o` X est sur le dessus de la pile et a est le prochain symbole dans lentre, u e lanalyseur eectue une des actions parmi les suivantes: Si X = a = $, lanalyseur arrte ses oprations et annonce une analyse russie. e e e Si X = a = $, lanalyseur dpile X et fait avancer le pointeur de lentre. e e Si X est un non-terminal, le programme de lanalyseur consulte la table danalyse en position M [X, a]. La case consulte fournit soit une production ` utiliser, soit une indication derreur. e a Si, par exemple, M [X, a] = {X U V W }, alors lanalyseur dpile X et empile W , V et U , e dans lordre. En cas derreur, lanalyseur sarrte et signale lerreur. e La sortie de lanalyseur consiste en la suite de productions utilises. e

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Analyse prdictive sans rcursion e e


Algorithme 4.3 Entre: Une cha w et la table danalyse M associe ` une grammaire G. e ne e a Sortie: Une drivation ` gauche dabord de w si w L(G) et le signalement dune erreur sinon. e a Mthode: e initialiser la pile avec S par-dessus $ et le tampon dentre avec w$; e faire pointer ip sur le premier symbole de lentre; e rpter e e soit X le symbole du dessus de pile et a le symbole point par ip; e si X est un terminal ou $ alors si X = a alors dpiler X et incrmenter ip e e sinon erreur () sinon / X est un non-terminal / si M [X, a] = X Y1 . . . Yk alors dbut e dpiler X; e empiler Yk , . . . , Y1 , dans lordre; acher la production X Y1 . . . Yk n sinon erreur () jusqu` ce que X = $ a / la pile est vide /

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Analyse prdictive sans rcursion e e


Exemple 4.16 ` A la grammaire: E E T T F TE +T E | FT F T | (E) | id

on associe la table danalyse suivante: Nonterminal E E T T F Symbole dentre e ( E TE T FT T F id T F T F (E) T T

id E TE T FT

+ E +T E

) E

$ E

Analyse prdictive de la cha id + id id. e ne

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

FIRST et FOLLOW
On dnit lensemble FIRST() comme tant lensemble des terminaux qui e e dbutent les cha e nes gnres ` partir de plus si peut gnrer . e ee a e e Formellement: FIRST() = {a | aw} { | } On peut calculer un ou des ensembles FIRST ` laide des r`gles suivantes: a e FIRST( ) = { }. FIRST(a ) = {a}. Si X est une production, FIRST(X) FIRST(). Si FIRST(X), alors FIRST(X) = (FIRST(X) { }) FIRST(), sinon FIRST(X) = FIRST(X).

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

FIRST et FOLLOW
On dnit lensemble FOLLOW(A), A tant un non-terminal, comme tant e e e lensemble des terminaux qui peuvent appara immdiatement ` droite de tre e a A dans une forme de phrase gnre par la grammaire. On ajoute $ ` e ee a FOLLOW(A) si A peut appara compl`tement ` droite dans une forme tre e a de phrase. Plus formellement, FOLLOW(A) = {a | S Aa} {$ | S A} On peut calculer les ensembles FOLLOW de tous les non-terminaux dune grammaire ` laide des r`gles suivantes: a e Si S est le symbole de dpart, alors $ FOLLOW(S). e Si A B est une production, alors FIRST() { } FOLLOW(B). Si A B est une production ou si A B est une production et que FIRST(), alors FOLLOW(A) FOLLOW(B).
IFT-15752 Compilation et interprtation e c Danny Dub 2006 e

FIRST et FOLLOW
Exemple 4.17 Considrons (une fois encore) cette grammaire: e E E T T F TE +T E | FT F T | (E) | id

alors les ensembles FIRST et FOLLOW des non-terminaux sont les suivants: FIRST(E) = FIRST(T ) = FIRST(F ) = {(, id} FIRST(E ) = {+, } FIRST(T ) = {, } FOLLOW(E) = FOLLOW(E ) = {), $} FOLLOW(T ) = FOLLOW(T ) = {+, ), $} FOLLOW(F ) = {, +, ), $}

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Construction de tables danalyse


Algorithme 4.4 Entre: Une grammaire G. e Sortie: Une table danalyse M . Mthode: e 1. Pour chaque production A , faire: (a) Pour chaque terminal a FIRST(), ajouter A ` M [A, a]; a (b) Si FIRST(), ajouter A ` M [A, b] pour chaque symbole b a FOLLOW(A). b est un terminal ou $. 2. Chaque case de M qui est encore indnie doit tre initialise ` un signalement e e e a derreur. Exemple 4.18.

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e

Construction de tables danalyse


Exemple 4.19 ` A la grammaire suivante (grammaire symbolisant le cas du if-then-else): S S E iEtSS | a eS | b

on associe la table danalyse suivante: Nonterminal S S E


IFT-15752

a Sa

Symbole dentre e e i S iEtSS S S eS

$ S

Eb
Compilation et interprtation e c Danny Dub 2006 e

Grammaires LL(1)
On dit quune grammaire est LL(1) si sa table danalyse ne comporte aucune case qui contient plus dune production. Labrviation LL(1) a la signication suivante: e le premier L indique que lentre (la suite de jetons) est lue de gauche ` droite (from Left to right); e a le second L indique que la technique recherche une drivation ` gauche dabord (Leftmost derivation); e a le 1 indique quun seul jeton constitue lhorizon de lanalyse. Les grammaires LL(1) poss`dent plusieurs proprits intressantes: e ee e Aucune grammaire ambigu ou comportant une rcursion ` gauche nest LL(1). e e a Sil existe deux productions A et A ( = ) dans une grammaire LL(1), on a que: il nexiste pas de terminal a tel que et gn`rent tous deux des cha e e nes qui commencent par a; au plus un de et peut gnrer la cha e e ne ; si , alors ne peut pas gnrer une cha dont le premier terminal est lment de FOLLOW(A). e e ne ee On peut crer un analyseur prdictif directement ` partir dune grammaire G si et seulement si G est LL(1). e e a

IFT-15752

Compilation et interprtation e

c Danny Dub 2006 e